之前写的服务器端 表示都无法收到client发的数据,找不到原因,原来是有个socket接收数据缓冲木有设置,现在设置后就可以正常收到数据啦!
server端:
#include <winsock.h> #include <stdio.h> #include <string> #pragma comment(lib, "ws2_32.lib") #define MYPORT 1234 // the port users will be connecting to #define BACKLOG 5 // how many pending connections queue will hold #define BUF_SIZE 200 int fd_A[BACKLOG]; // accepted connection fd int conn_amount; // current connection amount void showclient() { int i; printf("client amount: %d\n", conn_amount); for (i = 0; i < BACKLOG; i++) { printf("[%d]:%d ", i, fd_A[i]); } printf("\n\n"); } int main(void) { WSADATA wsaData; WSAStartup(0x0202, &wsaData); int sock_fd, new_fd; // listen on sock_fd, new connection on new_fd struct sockaddr_in server_addr; // server address information struct sockaddr_in client_addr; // connector's address information int sin_size; int yes = 1; char buf[BUF_SIZE]; int ret; int i; if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } //这一步很重要,不然数据可能收不到 int nRecvBuf = 32 * 1024; //设置为32K if (setsockopt(sock_fd,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)) == -1) { perror("setsockopt"); exit(1); } server_addr.sin_family = AF_INET; // host byte order server_addr.sin_port = htons(MYPORT); // short, network byte order server_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero)); if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); exit(1); } if (listen(sock_fd, BACKLOG) == -1) { perror("listen"); exit(1); } printf("listen port %d\n", MYPORT); fd_set fdsr; int maxsock; struct timeval tv; conn_amount = 0; sin_size = sizeof(client_addr); maxsock = sock_fd; while (1) { FD_ZERO(&fdsr); FD_SET(sock_fd, &fdsr); // timeout setting tv.tv_sec = 10; tv.tv_usec = 0; // add active connection to fd set for (i = 0; i < BACKLOG; i++) { if (fd_A[i] != 0) { FD_SET(fd_A[i], &fdsr); } } ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv); if (ret < 0) { perror("select"); break; } else if (ret == 0) { printf("timeout\n"); continue; } // check every fd in the set for (i = 0; i < conn_amount; i++) { if(fd_A[i] > 0) { if (FD_ISSET(fd_A[i], &fdsr)) { ret = recv(fd_A[i], buf, sizeof(buf), 0); if (ret <= 0) { // client close printf("client[%d] close\n", i); --conn_amount; closesocket(fd_A[i]); FD_CLR(fd_A[i], &fdsr); fd_A[i] = 0; } else { if (ret < BUF_SIZE) memset(&buf[ret], '\0', 1); printf("client[%d] send:%s\n", i, buf); } } } } // check whether a new connection comes if (FD_ISSET(sock_fd, &fdsr)) { new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size); if (new_fd <= 0) { perror("accept"); continue; } // add to fd queue if (conn_amount < BACKLOG) { for (int j = 0; j < BACKLOG; ++j) { if (fd_A[j] == 0) { fd_A[j] = new_fd; printf("new connection client[%d] %s:%d\n", conn_amount,inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); if (new_fd > maxsock) { maxsock = new_fd; } ++conn_amount; break; } } } else { printf("max connections arrive, exit\n"); send(new_fd, "bye", 4, 0); closesocket(new_fd); break; } } } // close other connections for (i = 0; i < BACKLOG; i++) { if (fd_A[i] != 0) { closesocket(fd_A[i]); } } exit(0); }
#include <stdio.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32") #define MYPORT 1234 // the port users will be connecting to void CleanUpSocket( SOCKET clientSocket ) { printf("SocketError:%d\n",WSAGetLastError()); closesocket(clientSocket); WSACleanup(); } int BytesSum = 0; int main() { int iResult; WORD wVersionRequested; WSADATA wsaData; SOCKET clientSocket; struct sockaddr_in clientService; wVersionRequested = MAKEWORD(2, 2); /* initialize windows socket */ iResult = WSAStartup(wVersionRequested, &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return -1; } else { printf("WSAStartup succeeded!\n"); } clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { printf("create socket failed with error: %d\n", WSAGetLastError()); WSACleanup(); return -1; } else { printf("create socket(%d) succeeded!\n", clientSocket); } clientService.sin_family = AF_INET; clientService.sin_port = htons(MYPORT); clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); iResult = connect(clientSocket, (SOCKADDR *) &clientService, sizeof(clientService)); if (iResult == SOCKET_ERROR) { CleanUpSocket(clientSocket); return -1; } else { printf("connect succeed!\n"); } char lBuf[100] = "Hello Kitty!"; int i = 0; char lrecvbyf[1024]; while(++i < 20) { int lResult = send(clientSocket, lBuf, strlen(lBuf)+1,0); if (SOCKET_ERROR == lResult) { CleanUpSocket(clientSocket); return 0; } else { BytesSum += lResult; printf("BytesSum(%d) Bytes Send:%d\n",BytesSum,lResult); } //lResult = recv(clientSocket, lrecvbyf, strlen(lrecvbyf)+1,0); //if (SOCKET_ERROR == lResult) //{ // CleanUpSocket(clientSocket); // return 0; //} //else //{ // lrecvbyf[lResult] = '\0'; // printf("recv:%s\n",lrecvbyf); // printf("BytesSum(%d) Bytes Send:%d\n",BytesSum,lResult); //} } closesocket(clientSocket); WSACleanup(); return 0; }
ok,继续努力,改进server端的缺点。
参考代码:http://www.cnblogs.com/faraway/archive/2009/03/06/1404449.html