簡體   English   中英

套接字TCP服務器程序問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM