我不太清楚为什么这段代码会向accept()调用返回无效参数。我没有问题就绑定和听,所以我应该能够接受()。如果我的acceptSocket()调用中有什么问题,我没有看到它。谁能指出我正确的方向?代码是:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
void setSocket(struct sockaddr_in* s_){
s_->sin_family=AF_INET;
s_->sin_port=htons(9999);
s_->sin_addr.s_addr=INADDR_ANY;
memset(&(s_->sin_zero), '\0', 8);
printf("s_->sin_family = %i\n", s_->sin_family);
printf("s_->sin_port = %i\n", s_->sin_port);
printf("s_->sin_addr.s_addr= %i\n", s_->sin_addr.s_addr);
}
void createSocket(int *sock){
if ((*sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){
fprintf(stderr, "Socket creation error: %s\n", strerror(errno));
exit(1);
}
printf("sock = %i\n", *sock);
fflush(stdout);
}
void bindSocket(int sock, struct sockaddr_in *s_){
printf("s_->sin_family = %i\n",s_->sin_family);
printf("s_->sin_port = %i\n",s_->sin_port);
printf("s_->sin_addr.s_addr = %i\n",s_->sin_addr.s_addr);
if((bind(sock, (struct sockaddr*)s_, sizeof(*s_))) == -1)
fprintf(stderr, "Socket bind error: %s\n", strerror(errno));
printf("sizeof(s_) = %lu\n", sizeof(*s_));
}
void acceptSocket(int sfd, struct sockaddr_in *s_){
int st = sizeof(*s_);
printf("sizeof(*s_) = %lu\n", sizeof(*s_));
// printf("(socklen_t*)&st_) = %i\n",(socklen_t*)&st);
fflush(stdout);
if(accept(sfd, (struct sockaddr*)s_, (socklen_t *)&st) == -1)
fprintf(stderr, "Socket accept error: %s\n", strerror(errno));
}
void closeSocket(int sockfd){
if(close(sockfd) == 1)
fprintf(stderr, "Socket close error: %s\n", strerror(errno));
}
void dialogue(int sockfd){
char s[1000];
int bytesRead = read(sockfd, s, 1000);
if(bytesRead == 1)
fprintf(stderr, "Socket read error: %s\n", strerror(errno));
if(write(sockfd, "I just read %i bytes!\n", *s, 100) == -1)
fprintf(stderr, "Socket write error: %s\n", strerror(errno));
if(write(sockfd, *s, bytesRead) == -1)
fprintf(stderr, "Socket Write error: %s\n", strerror(errno));
}
void listenSocket(int sfd){
if(listen(sfd, 100) == -1)
fprintf("Socket listen error: %s\n", strerror(errno));
}
int main(int argc, char* argv[]){
int sockfd;
struct sockaddr_in socket_;
createSocket(&sockfd);
setSocket(&socket_);
printf("sockfd = %i\n", sockfd);
fflush(stdout);
bindSocket(sockfd, &socket_);
listenSocket(sockfd);
while(1){
acceptSocket(sockfd, &socket_);
dialogue(sockfd);
}
exit(0);
}
答案 0 :(得分:1)
请学习accept
功能的手册。它通常在出错时返回-1,成功时它返回一个套接字的有效描述符,您可以通过该描述符进行通信。
基本上使用以下代码而不是当前函数:
int acceptSocket(int sfd, struct sockaddr_in *s_){
int st = sizeof(*s_);
printf("sizeof(*s_) = %lu\n", sizeof(*s_));
// printf("(socklen_t*)&st_) = %i\n",(socklen_t*)&st);
fflush(stdout);
int out = accept(sfd, (struct sockaddr*)s_, (socklen_t *)&st);
if(out == -1) {
fprintf(stderr, "Socket accept error: %s\n", strerror(errno));
}
return out;
}
然后继续使用返回值作为dialogue
函数的参数。我不能保证这会完全修复你的代码,但它肯定是TCP网络通信的开始。