寫了一個簡單的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~
uj5u.com熱心網友回復:
賦值運算子=的優先級小于比較運算子==,server accept的if,試試加個括號?if ((ClientSocket = accept(ServiceSocket, (sockaddr*)&clnadr, &ClientAdrSize))==SOCKET_ERROR)
uj5u.com熱心網友回復:
列印一下accept的回傳值就知道是否有回傳。以及你的后續處理是否正確uj5u.com熱心網友回復:
int ClientAdrSize = sizeof(sockaddr_in);
uj5u.com熱心網友回復:
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.
uj5u.com熱心網友回復:
#include<iostream>轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/109605.html
標籤:網絡編程
下一篇:vc++串口通信資料處理問題
