使用读写函数的C中的套接字错误
Socket error in C using read and write functions
我正试图在C中使用linux网络编程读取和写入套接字。我分别在客户端和服务器程序中成功地调用了"写入"answers"读取"。
我很难理解的部分是,在我的客户端程序上,我循环并调用write 5次,在服务器上,循环并调用read 5次。
这是预期输出:
MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message
这是实际输出:
MSG: I got your messageI got your messageMSG: I got your messageI got your messageMSG: I got your messageMSG: MSG:
正如您所看到的,预期输出和实际输出是不同的。看起来客户端可以在实际发送之前调用"write"两次。
这是我为客户端代码所做的
for(int i=0;i<5;i++)
{
int n = write(ssocket.socketFileDescriptor,"I got your message",18);
cout<<n<<" number of bytes written."<<endl;
if (n < 0) socketError("ERROR writing to socket");
}
这是服务器代码:
void* run(void* arg)
{
ServerSocket* ss = (ServerSocket*)arg;
//while(true)
for(int i=0;i<5;i++)
{
char buffer[256];
bzero(buffer,256);
int n = read(ss->newsockfd,buffer,256);
printf("MSG: %s",buffer);
}
close(ss->newsockfd);
}
这是对下面这个问题的补充,现在这个问题已经过时了。
我是不是错过了冲水的电话?
模拟Java';C++中的s线程类
您的客户端和服务器只是不协调。客户端以5倍的速度写入消息,服务器以5倍速度读取消息。在您的示例输出中,很明显,在您对read()
的第一次调用中,客户端已经发送了两次消息,在对read()
的第二次调用中它又发送了两个消息。read()
最多256个字符,每次调用它时,它只会尝试读取当前缓冲区中的任何内容。如果到那时客户端已经发送了多条消息,那么read()
将获取所有消息。
您通常需要某种类型的同步,例如,在发送一条消息后,您的客户端会等待服务器发送"OK"
或类似的消息,然后再发送第二条消息。除此之外,如果您有一个非常简单的通信格式,您可以使用某种消息结束标记(如换行符),这样服务器就可以区分它们。
相关文章:
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 一个非常简单的win32套接字代码,但工作错误
- 在网络套接字计时器滴答后增加asio短读错误
- 当发生套接字错误时,作为QWebSocket基础的QTcpSocket(或QSslSocket)是否会自行销毁
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 尝试关闭 SSL 套接字时使用升压 asio 1.64 的分段错误 (SIGSEGV)
- 包含线程后C++套接字错误WSAENOTSOCK (10038)
- 从客户端读取时出现套接字错误
- SFML 套接字 发送数据包时设置为 sf::套接字::错误
- 套接字错误 gcc 无法在 WinSock2.h 中获取函数
- UDP 套接字错误 10049
- 提升::ASIO 接受套接字错误已打开
- UDP TX/RX 中的套接字错误
- 正在处理windows套接字错误
- 使用读写函数的C中的套接字错误
- C++Winsock套接字错误:10038(WSAENOTSOCK)
- 套接字错误无法获取 WinSock2.h 中的函数
- 套接字错误的好资源