SOCKET编程入门求指导

runerback 2016-07-08 05:41:14
在网上搜到的 简单的 C++ SOCKET编程 ---基于TCP/IP协议 ,照着写下来,客户端发消息服务端没反应,也不知道连没连到服务器,不明真相。
复制代码有点多,不过为了知道具体原因我还是硬着头皮粘贴上来吧
客户端
void Main::CreateSocket(void)
{
WORD myVersionRequest = MAKEWORD(2, 2);
WSADATA wsaData;
int errorCode = WSAStartup(myVersionRequest, &wsaData);
if(errorCode)
{
printf("Socket Startup Failed: %d\n", GetLastError());
}
else if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
{
printf("Socket Startup Failed: %d\n", GetLastError());
WSACleanup();
}
else
{
printf("Socket Startup successed\n");
}
}

void Main::Connect(void)
{
sockClient=socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(6000);

connect(sockClient, (SOCKADDR*)&addr, sizeof(SOCKADDR));
printf("Connected to server");
}

void Main::Send(char* str)
{
send(sockClient, str, strlen(str)+1,0);
printf("Sending \"%s\"...", str);
}

void Main::Disconnect(void)
{
closesocket(sockClient);
printf("Disconnected from server");
}

void Main::DestroySocket(void)
{
WSACleanup();
printf("Socket Destroyed\n");
}

调用方法
int _tmain(int argc, _TCHAR* argv[])
{
Main client;
client.CreateSocket();
client.Connect();
while(1)
{
printf("\nEnter Message:\n");
char msg[100];
std::cin.getline(msg, 100);
client.Send(msg);
}
client.Disconnect();
client.DestroySocket();
return 0;
}


服务器
void Main::CreateSocket(void)
{
WORD myVersionRequest = MAKEWORD(2, 2);
WSADATA wsaData;
int errorCode = WSAStartup(myVersionRequest, &wsaData);
if(errorCode || LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
printf("Socket Startup Failed: %d\n", GetLastError());
}
printf("Socket Startup successed\n");
}

void Main::StartListen(void)
{
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addr.sin_port = htons(6000);
bind(serverSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
listen(serverSocket, 1);
printf("Listening...\n");
listening = true;
SOCKADDR_IN clientAddr;
int len = sizeof(SOCKADDR);
while(listening)
{
SOCKET sockConn = accept(serverSocket, (SOCKADDR*)&clientAddr, &len);
char recvBuffer[100];
recv(sockConn, recvBuffer, strlen(recvBuffer)+1, 0);
printf("Received From Client: %s\n", recvBuffer);
closesocket(sockConn);
}
}

void Main::StopListen(void)
{
listening = false;
}

void Main::DestroySocket(void)
{
WSACleanup();
printf("Socket Destroyed\n");
}

调用方法
int _tmain(int argc, _TCHAR* argv[])
{
Main server;
server.CreateSocket();
server.StartListen();
server.StopListen();
server.DestroySocket();

return 0;
}
...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我有源程序 要不要
runerback 2016-07-13
  • 打赏
  • 举报
回复
一直在写C#,回头写C++就感觉C#会让写代码的人越来越懒 其实我是想用C#写个程序来“托管”C++程序的网络通信,先写个C++版的小程序,然后就可以拿去测试了。不过问题已经解决了,结贴。
runerback 2016-07-13
  • 打赏
  • 举报
回复
引用 4 楼 kakabulusi 的回复:
程序上怎么处理,看完我的原因说明,我想你已经有办法了。

你这么一说我就清楚多了,重点是之前不知道服务端的accept和recv都是阻塞方法。
已经打到我想实现的效果了,除了乱码的那里不是很明白:
kakabulusi 2016-07-11
  • 打赏
  • 举报
回复
服务器端的程序出现问题了, 将ACCEPT操作放到while 循环外面。 原因: 客户端 connect 函数调用时候,服务器端必须调用一个ACCEPT函数进行接收传入的连接。在客户端只调用了一次connect。 而服务器端每次接收完毕传输的数据之后,需要重新等待新的连接进入,由于客户端未提交新的connect 连接进来,所以服务器进入阻塞状态。 程序上怎么处理,看完我的原因说明,我想你已经有办法了。
oyljerry 2016-07-09
  • 打赏
  • 举报
回复
只要是客户端连接有没有被服务器接受
runerback 2016-07-08
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
调用winsock API函数,都需要判断一下函数的返回值是什么,成功还是失败,失败了,WSAGetLastError的值又是什么?
好的,我去加上
Eleven 2016-07-08
  • 打赏
  • 举报
回复
调用winsock API函数,都需要判断一下函数的返回值是什么,成功还是失败,失败了,WSAGetLastError的值又是什么?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧