socket编程accept()始终返回SOCKET_ERROR

hakase_toshi 2017-01-26 06:20:59
写了一个简单的c语言socket程序,我用while循环阻塞accept()直到有客户端访问,现在的情况是客户端能够connect成功,但是就是服务端始终没返回正确的accept,一直卡在循环里面,无法进行下一步的recv()

服务端代码:
#include<iostream>
#include<winsock2.h>

using namespace std;



void ErrorHandling(char * Line) {
cout << Line << endl;
system("pause");
exit(-1);
}

int main() {

WSADATA wsadata;
sockaddr_in seraddr,clnadr;
SOCKET ServiceSocket, ClientSocket;
int ClientAdrSize;

char message[100]="NULL";
//char *server_ip = "192.168.1.105";
char *port = "8801";
int strlen=0;
const int BUF_SIZE = 100;

if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
ErrorHandling("WSAStartup Error!");

ServiceSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);


if (ServiceSocket == INVALID_SOCKET) {
ErrorHandling("ERROR");
system("pause");
exit(-1);
}

cout << "socket create success!" << endl;
memset(&seraddr, 0, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
seraddr.sin_port = htons(atoi(port));



if (bind(ServiceSocket, (SOCKADDR*)&seraddr,sizeof(seraddr)) == SOCKET_ERROR)
ErrorHandling("Bind Error!");
if (listen(ServiceSocket, 5) == SOCKET_ERROR)
ErrorHandling("Linsten ERROR");
cout << "bind()sucess" << endl;

while (1) {//问题就在这里,程序一直返回socket_error
if (ClientSocket = accept(ServiceSocket, (sockaddr*)&clnadr, &ClientAdrSize)==SOCKET_ERROR)
continue;
else {
cout << "connected!" << endl;
recv(ServiceSocket, message, BUF_SIZE, 0);
break;
}
}
cout << message;


system("pause");


return(0);
}



客户端代码:
#include<iostream>
#include<winsock2.h>
#include<string.h>
using namespace std;

void ErroHandling(char *ErrorLine) {
cout << ErrorLine << endl;
system("pause");
exit(-1);
}


int main() {
int const BUF_SIZE=100;
int strlen_;
char message[BUF_SIZE];
char* ipaddr = "192.168.1.105";
char* port = "8801";

WSADATA wsadata;
SOCKET ServerSocket;
SOCKADDR_IN SerAddr;

if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
ErroHandling("WSAstartup Error");

fgets(message, BUF_SIZE, stdin);
cout << message;
ServerSocket = socket(PF_INET, SOCK_STREAM, 0);
memset(&SerAddr, 0, sizeof(SerAddr));
SerAddr.sin_family = AF_INET;
SerAddr.sin_addr.s_addr = inet_addr(ipaddr);
SerAddr.sin_port = htons(atoi(port));
while (1) {
if (connect(ServerSocket, (sockaddr*)&SerAddr, sizeof(SerAddr)) == SOCKET_ERROR)
continue;
else {
cout << "connected!" << endl;
send(ServerSocket, message, strlen(message), 0);//这里发送消息
break;
}

}
system("pause");
strlen_ = recv(ServerSocket, message, BUFSIZ - 1, 0);//接收服务端返回的消息


closesocket(ServerSocket);
WSACleanup();
system("pause");
return(0);
}


求大腿帮助~help~
...全文
533 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakabulusi 2017-02-17
  • 打赏
  • 举报
回复
#include<iostream>
shenyi0106 2017-02-09
  • 打赏
  • 举报
回复
SOCKET accept( _In_ SOCKET s, _Out_ struct sockaddr *addr, _Inout_ int *addrlen ); Parameters s [in] A descriptor that identifies a socket that has been placed in a listening state with the listen function. The connection is actually made with the socket that is returned by accept. addr [out] An optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer. The exact format of the addr parameter is determined by the address family that was established when the socket from the sockaddr structure was created. addrlen [in, out] An optional pointer to an integer that contains the length of structure pointed to by the addr parameter.
shenyi0106 2017-02-09
  • 打赏
  • 举报
回复

int ClientAdrSize = sizeof(sockaddr_in);
oyljerry 2017-02-08
  • 打赏
  • 举报
回复
打印一下accept的返回值就知道是否有返回。以及你的后续处理是否正确
还有多远 2017-01-26
  • 打赏
  • 举报
回复
赋值操作符=的优先级小于比较操作符==,server accept的if,试试加个括号?
if ((ClientSocket = accept(ServiceSocket, (sockaddr*)&clnadr, &ClientAdrSize))==SOCKET_ERROR)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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