第二次运行此服务器代码时,出现此错误
“绑定失败:无法分配请求的地址”。
我正在使用RE_USEADDR
,但仍然遇到问题。我了解服务器在使用后并没有关闭。
命令行输入:
arg [1] = 127.0.0.1 ,arg [2] = 5019
代码
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
void reverse(char*, int, int);
int main(int argc, char* argv[]){
int welcomeSocket, newSocket;
char buffer[1024];
struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;
int val=1;
bzero((char*)&serverAddr,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(argv[2]));
serverAddr.sin_addr.s_addr = htonl(argv[1]);
if((welcomeSocket = socket(AF_INET, SOCK_STREAM, 0))==-1){
perror("socket err");
exit(1);}
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
setsockopt(welcomeSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(int));
if(bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr))<0){
perror("Binding failed\n");
exit(1);}
if(listen(welcomeSocket,5)==0)
printf("Listening\n");
else
printf("Error\n");
while(1){
printf("1");
addr_size = sizeof(serverStorage);
newSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size);
recv(newSocket, buffer, 1024, 0);
printf("Data received: %s",buffer);
reverse(buffer, 0, strlen(buffer)-1);
send(newSocket,buffer,13,0);
close(newSocket);
}
close(welcomeSocket);
return 0;
}
我希望它每次都能工作,无论其ip和端口如何。
答案 0 :(得分:2)
htonl
函数需要一个32位整数值。相反,您传递的是字符串的地址,因此您实际上是在尝试将该地址(以网络字节顺序转换为32位值)用作IP地址。
您反而希望将字符串传递给inet_addr
,该字符串将IPv4地址的字符串表示形式转换为网络字节顺序的32位值。
serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
答案 1 :(得分:-1)
退出程序时,套接字没有正常关闭。我建议使用信号中断处理程序并关闭welcomeSocket。
void sigintHandler(int sig_num) {
close(welcomeSocket);
}
int main(){
signal(SIGINT, sigintHandler);
...
...
your code
while (1) {
//code
}
}