我有一个小程序,可以从服务器和客户端发送和接收数据,反之亦然.一切正常,但我看不到双方收到的消息,它总是0字节.它没有给出任何编译错误但是没有按照我想要的方式工作.你能不能看看我做错了什么?谢谢
//客户
#include#include #include #include #include #include #include #include #include #include int main(int argc, char* argv[]) { int sockfd; struct addrinfo hints, *servinfo, *p; int rv; int numbytes; char* hostname = "localhost"; char* server = "localhost"; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; if ((rv = getaddrinfo(hostname, "5000", &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 0; } // loop through all the results and make a socket for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("client: socket"); continue; } if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("client: connect"); continue; } break; } if (p == NULL) { fprintf(stderr, "client: failed to bind socket\n"); return 2; } char message[] = "hi"; if ((numbytes = send(sockfd, message, 2, 0)) == -1) { perror("client: send"); exit(1); } int numbytesRecv; char buf[100]; if ((numbytesRecv = recv(sockfd, buf, 99, 0)) == -1) { perror("client: recv"); exit(1); } freeaddrinfo(servinfo); printf("client: sent %d bytes to %s\n", numbytes, server); printf("client: received %d bytes from %s\n", numbytesRecv, server); buf[numbytesRecv] = '\0'; printf("client: message received is %s\n",buf); close(sockfd); return 0; }
//服务器
#include#include #include #include #include #include #include #include #include #include #define MYPORT "5000" // the port users will be connecting to #define MAXBUFLEN 100 // get sockaddr, IPv4 or IPv6: void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); } int main(void) { int sockfdTCP; struct addrinfo hintsTCP, *servinfoTCP, *pTCP; int rv; int numbytes; struct sockaddr_storage their_addr; char buf[MAXBUFLEN]; size_t addr_len; char s[INET6_ADDRSTRLEN]; memset(&hintsTCP, 0, sizeof hintsTCP); hintsTCP.ai_family = AF_UNSPEC; hintsTCP.ai_socktype = SOCK_STREAM; hintsTCP.ai_flags = AI_PASSIVE; if ((rv = getaddrinfo(NULL, MYPORT, &hintsTCP, &servinfoTCP)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // loop through all the results and bind to the first we can for TCP socket for(pTCP = servinfoTCP; pTCP != NULL; pTCP = pTCP->ai_next) { if ((sockfdTCP = socket(pTCP->ai_family, pTCP->ai_socktype,pTCP->ai_protocol)) == -1) { perror("listener: socket"); continue; } if (bind(sockfdTCP, pTCP->ai_addr, pTCP->ai_addrlen) == -1) { close(sockfdTCP); perror("listener: bind"); continue; } break; } if (pTCP == NULL) { fprintf(stderr, "listener: failed to bind socket\n"); return 2; } freeaddrinfo(servinfoTCP); printf("listener: waiting to recvfrom...\n"); addr_len = sizeof their_addr; const int BACKLOG = 10; if (listen(sockfdTCP, BACKLOG) == -1) { perror("listen"); exit(1); } socklen_t sin_size; int new_fd; sin_size = sizeof their_addr; new_fd = accept(sockfdTCP, (struct sockaddr *)&their_addr, &sin_size); printf("I am here\n"); if (new_fd == -1) { perror("accept"); } if ((numbytes = recv(new_fd, buf, MAXBUFLEN, 0) == -1)) { perror("recv"); exit(1); } char* msg = " hi i am server"; int numbytesSend; if ((numbytesSend = send(new_fd, msg,strlen(msg), 0) == -1)) { perror("recv"); exit(1); } inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr), s, sizeof s); printf("server: got connection from %s\n", s); printf("listener: packet is %d bytes long\n", numbytes); buf[numbytes] = '\0'; printf("listener: packet contains : %s\n", buf); close(sockfdTCP); close(new_fd); return 0;
}
//输出客户端
./clientTCP client: sent 2 bytes to localhost client: received 0 bytes from localhost client: message received is
//输出服务器
./serverTCP listener: waiting to recvfrom... I am here server: got connection from 127.0.0.1 listener: packet is 0 bytes long listener: packet contains :
Duck.. 7
您的问题是服务器中的这一行:
if ((numbytes = recv(new_fd, buf, MAXBUFLEN, 0) == -1))
它应该是:
if ((numbytes = recv(new_fd, buf, MAXBUFLEN, 0)) == -1)
这将允许正确分配numbytes,这允许
buf[numbytes] = '\0';
做你想做的事
printf("listener: packet contains : %s\n", buf);
打印你想要的.
同样的处理
if ((numbytesSend = send(new_fd, msg, strlen(msg), 0) == -1))
但是bug在示例程序中没有表现出来.
您的问题是服务器中的这一行:
if ((numbytes = recv(new_fd, buf, MAXBUFLEN, 0) == -1))
它应该是:
if ((numbytes = recv(new_fd, buf, MAXBUFLEN, 0)) == -1)
这将允许正确分配numbytes,这允许
buf[numbytes] = '\0';
做你想做的事
printf("listener: packet contains : %s\n", buf);
打印你想要的.
同样的处理
if ((numbytesSend = send(new_fd, msg, strlen(msg), 0) == -1))
但是bug在示例程序中没有表现出来.