【发布时间】:2015-12-07 07:40:39
【问题描述】:
请帮帮我
客户:
#include<stdio.h> //printf
#include<string.h> //strlen
#include<sys/socket.h> //socket
#include<arpa/inet.h> //inet_addr
int main(int argc , char *argv[])
{
int sock;
struct sockaddr_in server;
char message[1000] , server_reply[2000];
//Create socket
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1)
{
printf("Could not create socket");
}
puts("Socket created");
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons( 8888 );
//Connect to remote server
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
{
perror("connect failed. Error");
return 1;
}
puts("Connected\n");
//keep communicating with server
while(1)
{
printf("Enter message : ");
scanf("%s" , message);
//Send some data
if( send(sock , message , strlen(message) , 0) < 0)
{
puts("Send failed");
return 1;
}
memset(message,0,sizeof(message));
//Receive a reply from the server
}
close(sock);
return 0;
}
服务器:
#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h> //write
int main(int argc , char *argv[])
{
int socket_desc , client_sock , c , read_size;
struct sockaddr_in server , client;
char client_message[2000];
//Create socket
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}
puts("Socket created");
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 8888 );
//Bind
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
perror("bind failed. Error");
return 1;
}
puts("bind done");
//Listen
listen(socket_desc , 3);
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
//accept connection from an incoming client
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
if (client_sock < 0)
{
perror("accept failed");
return 1;
}
puts("Connection accepted");
//Receive a message from client
while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 )
{
if(read_size == 0)
{
puts("Client disconnected");
fflush(stdout);
}
else if(read_size == -1)
{
perror("recv failed");
}
//Send the message back to client
puts(client_message);
fflush(stdout);
}
return 0;
}
它是来自网站的源代码。我试了一下,成功连接并发送消息。问题是当我将客户端连接到服务器时。然后我用 ctrl + c 关闭服务器。我尝试发送消息,为什么我的消息发送成功? (当服务器结束时)。但是当我再次尝试发送消息时,连接结束。请帮我。我只想发送一次,连接结束。不是两次。
【问题讨论】:
-
检测断开连接的唯一可靠方法是尝试从套接字读取,在这种情况下
recv函数应该返回零。 -
怎么做?。对不起,我是新手。我应该连接其他套接字。或者当我发送消息时,我使用 recv ? (对不起我的英语。)
-
您可能需要考虑您的协议,以及客户端和服务器之间的通信方式。也许服务器应该通过向客户端发送一条客户端可以读取的小消息来确认它收到的每条消息?
-
谢谢。为你的帮助。我会再次学习。
-
关于这一行:
if(read_size == 0),这永远不会是真的,因为如果read()的返回值为 == 0,则前面的while()语句将退出其循环。