【发布时间】:2017-12-29 13:49:21
【问题描述】:
我用 C 语言创建了一个简单的服务器,并用 Java 创建了一个简单的客户端,作为大型应用程序中功能的替代品。我能够将客户端连接到服务器,并且客户端能够接收来自服务器的消息。但是,当我尝试从服务器中的客户端接收消息时,我什么也得不到。经过一番研究,我相当有信心我的客户应该可以工作,所以我觉得问题一定出在接收方,但我真的不确定问题是什么,因为我使用了基本相同的 C其他应用程序的代码没有问题。如果有人可以帮助我解决这个问题,我将非常感激。
这是简单的 Java 代码:
public static void main(String[] args) {
try{
Socket sock = new Socket("localhost",9000);
BufferedReader inputBuffer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String line = inputBuffer.readLine();
System.out.println("From server : "+line);
PrintWriter out = new PrintWriter(sock.getOutputStream());
String toSend = "I am sending you a message. I sure hope you get it.\n";
out.write(toSend.toCharArray());
out.flush();
out.close();
}catch(Exception e)
{
}
这是我的 C 代码:
int main(int argc, char** argv) {
int port = 9000;
int buffer_size = 256;
int sock;
int new_sock;
socklen_t client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
char* line_status;
int len;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
printf("Couldn't open socket.\n");
}
bzero((char*) &server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(port);
int status = bind(sock,
(struct sockaddr *) & server_address,
sizeof(server_address));
if(status < 0)
{
printf("Error binding to socket.\n");
}
listen(sock, 5);
client_len = sizeof(client_address);
printf("Listening for clients on port %d...\n", port);
new_sock = accept(sock,
(struct sockaddr *) &client_address,
&client_len);
if(new_sock < 0)
{
printf("Error accepting connection.\n");
}else
{
printf("Connected\n");
char outbuffer[] = "123456789\n";
int write_stat = write(new_sock, outbuffer, 10);
printf("wrote message to socket\n");
char buffer[buffer_size];
int read_stat = 0;
while(read_stat <= 0)
{
char c;
read_stat = read(port,buffer, buffer_size);
if(read_stat >0)
{
printf("read_stat = %d\n",read_stat);
printf("received message: %s\n",buffer);
}
}
printf("done\n");
}
return 0;
}
【问题讨论】:
-
任何
read()或recv()调用如果没有将结果存储到变量中和/或没有分别测试零和-1,则写入不正确。 -
格式化/缩进,以及@EJP 所说的内容。
-
and,(不可避免?),'printf("received message: %s\n",buffer);' - 在未安全 NUL_terminated 的缓冲区上使用需要 NUL 终止字符串的调用(如果您完全正确地处理了读取返回的结果,则可以避免这种情况,如 EJP 发布的那样)。
-
应该是
printf("received message %.*s\n", read_stat, buffer)。无需终止任何内容。而read_stat对于计数变量的命名很糟糕。 @MartinJames -
@EJP 是一个替代方案,当然:)