我試圖創建一個與自身連接的程序。 我觸發一個線程客戶端和一個線程服務器,併爲每個線程創建一個套接字。我使用相同的端口。C連接失敗套接字
當線程客戶端嘗試連接到線程服務器時,連接失敗。爲什麼?我無法理解。幫我!
完整的代碼很複雜,因爲它很大。但我會概括。
#define ADDR "127.0.0.1"
struct threadData{
int portnum;
int sockid;
int lastID;
unsigned int lastCheck;
};
// ----------- ----- Connection ------ ------------- //
void dieError(char *message, int socket){
printf("%s\n", message);
if(socket != 0)
close(socket);
exit(1);
}
int createSocket(int portnum, struct sockaddr_in* netw){
int sockid;
sockid = socket(AF_INET, SOCK_STREAM, 0);
if(sockid == -1)
dieError("socket() failed", sockid);
struct in_addr addrr;
if(inet_pton(AF_INET, ADDR, &addrr) < 1)
dieError("pton() failed", sockid);
netw->sin_family = AF_INET;
netw->sin_port = htons(portnum);
netw->sin_addr = addrr;
return sockid;
}
void listenSocket(struct threadData* thd, struct sockaddr_in* netw){
if(bind(thd->sockid, (struct sockaddr *) netw, sizeof(struct sockaddr)) == -1)
dieError("bind() failed", thd->sockid);
if(listen(thd->sockid, 0) == -1)
dieError("listen() failed", thd->sockid);
}
int acceptConnection(int sockid, struct sockaddr* addrr){
socklen_t cLen = sizeof(struct sockaddr);
int cSocket = accept(sockid, addrr, &cLen);
if(cSocket == -1)
dieError("accept() failed", sockid);
return cSocket;
}
int createConnection(int portnum, struct sockaddr_in* netw){
int sockid = createSocket(portnum, netw);
fcntl(sockid, F_SETFL, O_NONBLOCK);
if(connect(sockid, (struct sockaddr *) netw, sizeof(struct sockaddr)) == -1)
dieError("connect() failed", sockid);
return sockid;
}
// ----------- ----- ---------- ------ ------------- //
//Receptor thread
void * verifyPort(void * param){
struct threadData* thd = param;
int cSocket;
struct sockaddr addrr;
struct sockaddr_in* netw = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));
thd->sockid = createSocket(thd->portnum, netw);
listenSocket(thd, netw);
cSocket = acceptConnection(thd->sockid, &addrr);
}
//Sender thread
void verifyKeyboard(int portnum){
int sockid;
struct sockaddr_in* netw = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));
sockid = createConnection(portnum, netw);
}
// ----------- ---- -------- ------- ------------- //
int main(int argc, char **argv){
pthread_t tid;
struct threadData* thd;
thd = (struct threadData*) malloc(sizeof(struct threadData));
thd->portnum = atoi(argv[1]);
thd->lastID = -1;
thd->lastCheck = 0;
pthread_create(&tid, NULL, verifyPort, thd);
verifyKeyboard(atoi(argv[1]));
free(thd);
return 0;
}
可能值得用['strerror(errno)']打印錯誤信息(http://man7.org/linux/man-pages/man3/strerror.3.html)('strerror'在''和'errno'在''中定義) –
Frxstrem
可能完整的代碼會有所幫助。 – CristiFati
失敗如何?無法連接?超時?什麼也沒做?獲取重置? – EJP