gpt4 book ai didi

c++ - 套接字TCP服务器程序问题

转载 作者:可可西里 更新时间:2023-11-01 02:55:46 25 4
gpt4 key购买 nike

以下代码是我的TCP服务器程序:

    #include    #include    #pragma comment (lib,"ws2_32.lib")    #define PORT 8888    #define ADDR "127.0.0.1"

int main()
{
WSADATA wsock;
SOCKET listensocket,connectsocket;
SOCKADDR_IN seraddr,cliaddr;
int cliaddrsize=sizeof(cliaddr);
int nret=0;
char buf[100];

printf("init socket ...\n");
if(WSAStartup(MAKEWORD(2,2),&wsock)!=0)
{
printf("WSAStartup() failed %d\n",WSAGetLastError());
return 0;
}
printf("init successfully\n");
printf("create TCP socket...\n");

if((listensocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
{
printf("socket create failed %d\n",WSAGetLastError());
WSACleanup();
return 0;
}
printf("socket create successfully\n");

seraddr.sin_family=AF_INET;
seraddr.sin_addr.s_addr=inet_addr(ADDR);
seraddr.sin_port=htons(PORT);
if(bind(listensocket,(SOCKADDR *)&seraddr,sizeof(seraddr))==SOCKET_ERROR)
{
printf("bind failed %d\n",WSAGetLastError());
closesocket(listensocket);
WSACleanup();
return 0;
}
printf("bind successfully\n");

if(listen(listensocket,5)==SOCKET_ERROR)
{
printf("listen failed %d\n",WSAGetLastError());
closesocket(listensocket);
WSACleanup();
return 0;
}
printf("wait for a connection on port %d\n",PORT);

if(connectsocket=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize)==INVALID_SOCKET) //accept
{
printf("accept failed %d\n",WSAGetLastError());
closesocket(listensocket);
WSACleanup();
return 0;
}
printf("get connection from %s : %d successfully\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));//NB 啊
closesocket(listensocket);

printf("wait to receive data...\n");
memset(buf,0,sizeof(buf));
while(1)
{
if(nret=recv(connectsocket,buf,sizeof(buf),0)==SOCKET_ERROR) //recv
{
printf("recv failed %d\n",WSAGetLastError());
closesocket(connectsocket);
WSACleanup();
return 0;
}
printf(buf);
printf("\n");
if(strncmp(buf,"exit",sizeof("exit"))==0)
{
printf("exit the loop\n");
break;
}
if(nret=send(connectsocket,buf,sizeof(buf),0)==SOCKET_ERROR)
{
printf("send failed %d\n",WSAGetLastError());
}
}
closesocket(connectsocket);
WSACleanup();
return 0;
}



<p>And I use my network debugging assistent software to run as a TCP client. As follows:</p>

<p>I started my TCP server program, it went as follows:</p>

(...cannot upload images...)

但是当我点击我的 TCP 客户端时,TCP 服务器出错了:DOS 框显示:接收失败 10038

我的问题是为什么出错了?以及如何解决?

最佳答案

这个:

if(connectsocket=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize)
==INVALID_SOCKET)

将导致 connectsocket 的值为 0,它不引用有效的套接字描述符,错误代码 10038 表示:

An operation was attempted on something that is not a socket.

因为operator precedence :

// Result of this will be 0 (false) when result of accept()
// is not `INVALID_SOCKET`
accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize) == INVALID_SOCKET

// Which is then assigned to connectsocket
connectsocket = 0

// And the failing if branch is not entered
if (connectsocket)

您需要在作业周围加上括号:

if((connectsocket=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize))
==INVALID_SOCKET)

您已经为之前调用 socket() 完成了这些操作。

关于c++ - 套接字TCP服务器程序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com