[英]socket TCP server program problems
以下代碼是我的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;
}
And I use my network debugging assistent software to run as a TCP client. As follows: I started my TCP server program, it went as follows:
And I use my network debugging assistent software to run as a TCP client. As follows: I started my TCP server program, it went as follows:
(...cannot upload images...)
但是,當我單擊我的TCP客戶端時,TCP服務器出錯了:dos框顯示:recv failed 10038
我的問題是為什么出問題了? 以及如何解決?
這個:
if(connectsocket=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize)
==INVALID_SOCKET)
將導致connectsocket
的值為0
,它不引用有效的套接字描述符,錯誤代碼10038
表示:
嘗試對非套接字的對象進行操作。
由於運算符優先級 :
// 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()
調用。
您在以下行中出錯:
if(connectsocket=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize)==INVALID_SOCKET) //accept
它應該是:
if((connectsocket=accept(listensocket,(SOCKADDR*)&cliaddr,&cliaddrsize))==INVALID_SOCKET) //accept
注意括號 。 在原始代碼中,您將比較結果分配給connectocket變量(其結果始終為零)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.