尝试从服务器tcp读回数据时,客户端挂起
我正在尝试创建一个简单的tcp服务器客户端。如果客户端向服务器发送数据,我的程序工作正常,但当服务器尝试应答时,整个连接将挂起。我正在使用write()/read()函数 服务器代码:尝试从服务器tcp读回数据时,客户端挂起,c,tcp,client-server,C,Tcp,Client Server,我正在尝试创建一个简单的tcp服务器客户端。如果客户端向服务器发送数据,我的程序工作正常,但当服务器尝试应答时,整个连接将挂起。我正在使用write()/read()函数 服务器代码: #include <stdio.h> #include <stdlib.h> #include <netdb.h> #include <netinet/in.h> #include <string.h> #include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
#include <stdbool.h>
#define SIZE 700000000
///////////////////////////////////////////////////////////////////////////
int main( int argc, char *argv[] ) {
int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
/* First call to socket() function */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 5001;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
exit(1);
}
listen(sockfd, 10);
clilen = sizeof(cli_addr);
/* Accept actual connection from the client */
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}
bzero(buffer, 255);
int readbyte = 0;
do {
readbyte = read(newsockfd, buffer, 1024);
if (readbyte < 0)
{
perror("ERROR on reading socket!");
break;
}
if (readbyte > 0)
{
//printf("Here is the message: %s\n",buffer);
}
} while (readbyte > 0); /* until EOF */
int writen = write(newsockfd, "I received your message", strlen("I received your message") + 1);
if (writen<0){
perror("Error");
}
//debug();
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义大小70000000
///////////////////////////////////////////////////////////////////////////
int main(int argc,char*argv[]){
int sockfd、newsockfd、portno、clilen;
字符缓冲区[256];
服务地址中的结构sockaddr\u,cli\u addr;
int n;
/*第一次调用socket()函数*/
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror(“错误打开插座”);
出口(1);
}
bzero((char*)&serv_addr,sizeof(serv_addr));
端口号=5001;
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(端口号);
if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0){
perror(“绑定错误”);
出口(1);
}
听(sockfd,10);
clilen=sizeof(cli_addr);
/*接受来自客户端的实际连接*/
newsockfd=accept(sockfd,(struct sockaddr*)&cli\u addr,&clilen);
if(newsockfd<0){
perror(“接受错误”);
出口(1);
}
bzero(缓冲区,255);
int readbyte=0;
做{
readbyte=read(newsockfd,缓冲区,1024);
if(readbyte<0)
{
perror(“读取套接字时出错!”);
打破
}
如果(读取字节>0)
{
//printf(“这是消息:%s\n”,缓冲区);
}
}而(readbyte>0);/*直到EOF*/
int writen=write(newsockfd,“我收到了你的消息”,strlen(“我收到了你的消息”)+1);
if(writenh_addr,(char*)&serv_addr.sin_addr.s_addr,server->h_length);
serv_addr.sin_port=htons(端口号);
int sock_et=connect(sockfd,(struct sockaddr*)和serv_addr,sizeof(serv_addr);
/*现在连接到服务器*/
如果(sock_et<0){
perror(“错误连接”);
出口(1);
}
/*一些代码*/
而(len>0){
int writen=写入(sockfd、buf、len+1);
如果(写入<0)
{
printf(“写入套接字时出错!\n”);
打破
}
len-=写入;
buf+=writen;/*复杂指针算术*/
}
printf(“已完成写入服务器\n”);
b0(缓冲器,256);
int读取字节;
做{
readbyte=read(sock_et,buffer,1024);
if(readbyte<0)
{
perror(“读取套接字时出错!”);
打破
}
如果(读取字节>0)
{
//printf(“这是消息:%s\n”,缓冲区);
}
}而(readbyte>0);/*直到EOF*/
printf(“%s\n”,缓冲区);
关闭(sockfd);
返回0;
}
任何帮助都将不胜感激!谢谢
中断
sockfd
读取,而不是从sock\u et
中断
sockfd
读取,而不是从sock\u et
如果我使用这些文件,它可以正常工作。因此,从它们开始,更仔细地应用您的更改。在服务器和客户端中,您都有256字节的缓冲区,但您告诉
read
它可以将1024字节读入该缓冲区。迟早会导致缓冲区溢出和未定义的行为,并且可能是非常糟糕的stuff正在发生。你是对的。我没有注意到!非常感谢:)@Someprogrammerdude我已经更改了它,但仍然挂在服务器和客户端上。你有一个256字节的缓冲区,但你告诉read
它可以将1024字节读入该缓冲区。迟早会导致缓冲区溢出和未定义的行为,可能会发生非常糟糕的事情。你是对的,我没有注意到!非常感谢:)@Someprogrammerdude我已经更改了,但仍然挂起
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
//////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
int mode;
char *code;
char buffer[256];
char *uptr = buffer;
int i;
if (argc < 3) {
fprintf(stderr, "Use: %s [hostname] [port] [args]\n", argv[1]);
exit(0);
}
portno = atoi(argv[2]);
/* Create a socket point */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr, "ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
int sock_et = connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr);
/* Now connect to the server */
if (sock_et < 0) {
perror("ERROR connecting");
exit(1);
}
/* some code... */
while (len > 0) {
int writen = write(sockfd, buf, len + 1);
if (writen < 0)
{
printf("Error writting to socket!\n");
break;
}
len -= writen;
buf += writen; /* tricky pointer arythmetic */
}
printf("Finished writing to server\n");
bzero(buffer, 256);
int readbyte;
do {
readbyte = read(sock_et, buffer, 1024);
if (readbyte < 0)
{
perror("ERROR on reading socket!");
break;
}
if (readbyte > 0)
{
//printf("Here is the message: %s\n",buffer);
}
} while (readbyte > 0); /* until EOF */
printf("%s\n",buffer );
close(sockfd);
return 0;
}