我想将客户端和服务器端写在同一个程序下:
客户端循环发送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);
}
}
客户端循环发送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);
}
}
也不能工作啊。
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就不能再建立连接了。
可是还是不工作。如果将线程函数中的
//recvBuf[0] = '\0';
//Sleep(100);
这两句注释掉。
closesocket(sockConn);结果打印很多个[1],但是数量又不是[7]个。