socket编程 accept返回-1但是 显示NO error

chenise 2015-09-24 11:01:45
服务端代码如下
#include <stdio.h>
#include <winsock2.h> // winsock接口
#pragma comment(lib, "ws2_32.lib") // winsock实现

int main()
{
WORD wVersionRequested; // 双字节,winsock库的版本
WSADATA wsaData; // winsock库版本的相关信息

wVersionRequested = MAKEWORD(2, 2); // 0x0101 即:257


// 加载winsock库并确定winsock版本,系统会把数据填入wsaData中
WSAStartup(wVersionRequested, &wsaData);


// AF_INET 表示采用TCP/IP协议族
// SOCK_STREAM 表示采用TCP协议
// 0是通常的默认情况
unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0);

SOCKADDR_IN addrSrv;

addrSrv.sin_family = AF_INET; // TCP/IP协议族
addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; //inet_addr("0.0.0.0");
addrSrv.sin_port = htons(8888); // socket对应的端口

// 将socket绑定到某个IP和端口(IP标识主机,端口标识通信进程)
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

// 将socket设置为监听模式,5表示等待连接队列的最大长度
listen(sockSrv, 5);

SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);

while (1)
{
// sockSrv为监听状态下的socket
// &addrClient是缓冲区地址,保存了客户端的IP和端口等信息
// len是包含地址信息的长度
// 如果客户端没有启动,那么程序一直停留在该函数处
unsigned int sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
printf("%d", sockConn);
printf("%s\n", strerror(errno));

char sendBuf[100] = { 0 };
sprintf(sendBuf, "%s", inet_ntoa(addrClient.sin_addr)); // 将客户端的IP地址保存下来
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0); // 发送数据到客户端,最后一个参数一般设置为0

char recvBuf[100] = { 0 };
recv(sockConn, recvBuf, 100, 0); // 接收客户端数据,最后一个参数一般设置为0
printf("%s\n", recvBuf);
closesocket(sockConn);
}

closesocket(sockSrv);
WSACleanup();

return 0;
}

客户端代码如下:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);

WSAStartup(wVersionRequested, &wsaData);

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(8888);
int ret = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

char recvBuf[100] = { 0 };
recv(sockClient, recvBuf, 100, 0);
printf("%s\n", recvBuf);
send(sockClient, "hello world", strlen("hello world") + 1, 0);

closesocket(sockClient);
WSACleanup();

return 0;
}


开始时发现 服务端和客户端都不能收到 信息,于是查看 accept的返回值 为-1,但是打印错误显示No error,同时客户端的connect返回值为0 在netstat命令中 这个TCP连接的状态是 监听中
想知道问题出在哪了 为什么 返回-1却显示 No error
...全文
589 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_1813586318 2015-09-28
  • 打赏
  • 举报
回复 2
把服务端的这段代码send(sockConn, sendBuf, strlen(sendBuf) + 1, 0)改成send(sockConn, sendBuf, sizeof(sendBuf), 0)

1,314

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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