C 了解客户机-服务器连接
我是套接字编程新手,我正在尝试在linux中使用gcc编译器建立服务器-客户机连接。服务器和客户端,这两个代码在不同的C文件中。我通过用户输入向服务器发送一个字符,服务器增加字符并将其返回给客户端。客户端应保持连接,直到我从用户处获得字符“Q”。我在维护连接时遇到问题。这里我粘贴了客户端代码。当我不使用while循环并且只发送一个字符时,它可以正常工作,但是如果我重复地希望通过相同的连接发送字符,并且只有当用户输入Q时,连接才会关闭。那么,在循环的第一次迭代中,它请求字符,并成功地从服务器获取递增字符,但第二次它说“传输端点已连接”。请帮助我理解这一点C 了解客户机-服务器连接,c,linux,sockets,C,Linux,Sockets,我是套接字编程新手,我正在尝试在linux中使用gcc编译器建立服务器-客户机连接。服务器和客户端,这两个代码在不同的C文件中。我通过用户输入向服务器发送一个字符,服务器增加字符并将其返回给客户端。客户端应保持连接,直到我从用户处获得字符“Q”。我在维护连接时遇到问题。这里我粘贴了客户端代码。当我不使用while循环并且只发送一个字符时,它可以正常工作,但是如果我重复地希望通过相同的连接发送字符,并且只有当用户输入Q时,连接才会关闭。那么,在循环的第一次迭代中,它请求字符,并成功地从服务器获取递
int main(int argc, char *argv[])
{
int sockfd;
int len, port;
struct sockaddr_in address;
int result;
char ch;
port = atoi(argv[1]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = port;
len = sizeof(address);
while (1){
printf("Enter Character To Send The Server OR Q/q To End The Connection:");
scanf("%c", &ch);
fflush(stdin);
if (connect(sockfd, (struct sockaddr *)&address, len) == -1) {
perror("oops: client failed to connect");
return 1;
}
if (ch == 'Q' || ch == 'q'){
printf("Connection Closed");
break;
}
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("Incremented character from server = %c\n", ch);
} close(sockfd);
return 0;
}
如果不发布后续编辑,就很难准确判断出哪里可能出错 可能是由于括号的放置(作为while循环块定义的一部分)而意外关闭了文件描述符 在您的情况下,应该只需要调用connect()一次。 下面的代码对我来说很好(我的服务器代码只是将客户端接收到的字符写回它,客户端按预期接收/打印它) 我必须补充:
address.sin_port = htons(port);
然后将connect()函数调用移出while循环,确保关闭函数调用仅在从循环中断时进行,即接收q或q
如果您仍然有问题,那么可能在服务器代码中发生了一些奇怪的事情。您是否意外断开了客户端的连接
这里有一些很好的、容易理解的例子:
消息说明了一切:您正在尝试连接一个已连接的套接字(在第二次和以后的迭代中)。在TCP中,一旦建立连接,它将保持打开状态,直到您手动关闭它。只要将
connect
调用移出while
循环即可。@szczurcio是的,我尝试将连接置于循环之前,在这种情况下,输出如下。异常终止。输入字符以发送服务器或Q/Q以结束连接:从服务器递增的字符=B输入字符以发送服务器或Q/Q以结束连接:从服务器递增的字符=输入字符以发送服务器或Q/Q以结束连接:K“程序终止
int main(int argc, char *argv[])
{
int sockfd;
int len, port;
struct sockaddr_in address;
int result;
char ch;
port = atoi(argv[1]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = htons(port);
len = sizeof(address);
if (connect(sockfd, (struct sockaddr *)&address, len) == -1) {
perror("oops: client failed to connect");
return 1;
}
while(1)
{
printf("Enter Character To Send The Server OR Q/q To End The Connection:");
scanf("%c", &ch);
fflush(stdin);
if (ch == 'Q' || ch == 'q'){
printf("Connection Closed");
break;
}
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("Incremented character from server = %c\n", ch);
}
close(sockfd);
return 0;
}