首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

socket通信,该如何解决

2012-01-28 
socket通信我想将客户端和服务器端写在同一个程序下:客户端循环发送1,2,3,4,5,6,7到服务器端,服务器分别将

socket通信
我想将客户端和服务器端写在同一个程序下:
客户端循环发送1,2,3,4,5,6,7到服务器端,服务器分别将他们显示出来。

出现的问题是:只显示了1,后面的2,3,4,5,6,7无法显示。

下面是我的代码:
char recvBuf[100];
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if( err != 0 )
{
return;
}

if( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup();
return;
}

HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, Server, NULL, 0, NULL);
CloseHandle(hThread1);

SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

char sendBuf[100];
for(int i = 1; i <= 7; ++i)
{
sprintf(sendBuf, "[ %d ]", i);
send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(100);
}

WSACleanup();

}

DWORD WINAPI Server(
LPVOID lpParameter
)
{

SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);


bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
listen(sockSrv, 5);

SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
recv(sockConn, recvBuf, 100, 0);
printf("%s\n", recvBuf);
recvBuf[0] = '\0';
Sleep(100);
closesocket(sockConn);
}
}

[解决办法]
你把closesocket(sockConn);这行代码方在while(1)里面是什么用处?

接收一次就关闭?
[解决办法]
你的程序的问题出现在客户端的Connect哪里。
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

char sendBuf[100];
for(int i = 1; i <= 7; ++i)
{
sprintf(sendBuf, "[ %d ]", i);
send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(100);
}
你先Connection了,然后去做循环,而服务端的While循环又把套接字关闭了,需要重新Connect。不Connect就不能再建立连接了。
[解决办法]
把while里的closesocket去掉,把accept放到while之外,这样修改试试。

热点排行