Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C while/for循环的存在会导致异常执行_C_Sockets - Fatal编程技术网

C while/for循环的存在会导致异常执行

C while/for循环的存在会导致异常执行,c,sockets,C,Sockets,我制作了小型服务器和客户端程序来比较udp和tcp所用的时间。所以我做了一个while循环来发送100条消息。问题似乎是tdp客户机中存在循环导致程序在某一行之后停止执行。调试行也没有被执行。我从未见过这种行为。 我希望循环执行100次,并输出这些循环所花费的时间。但是otput只是 与服务器的连接:端口127.0.0.1:55057 /* usage: ./tcpclient host port */ #include <stdio.h> #include <stdlib.

我制作了小型服务器和客户端程序来比较udp和tcp所用的时间。所以我做了一个while循环来发送100条消息。问题似乎是tdp客户机中存在循环导致程序在某一行之后停止执行。调试行也没有被执行。我从未见过这种行为。 我希望循环执行100次,并输出这些循环所花费的时间。但是otput只是
与服务器的连接:端口127.0.0.1:55057

/* usage: ./tcpclient host port */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <arpa/inet.h>

#define BUFSIZE 1024

void error(char *msg) {
   perror(msg);
   exit(0);
}

int main(int argc, char **argv) {
    int sockfd, portno, n;
    struct sockaddr_in serveraddr;
    struct hostent *server;
    char *hostname;
    char buf[BUFSIZE];
    strcpy(buf, "hello");
    clock_t start;  int count=0;
    /* check command line arguments */
    if (argc != 3) {
        fprintf(stderr,"usage: %s <hostname> <port>\n", argv[0]);
        exit(0);
    }
    hostname = argv[1];
    portno = atoi(argv[2]);

    /* socket: create the socket */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR opening socket");

    /* gethostbyname: get the server's DNS entry */
    server = gethostbyname(hostname);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host as %s\n", hostname);
        exit(0);
    }
    /* build the server's Internet address */
    bzero((char *) &serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    bcopy((char *)server->h_addr,
            (char *)&serveraddr.sin_addr.s_addr, server->h_length);
    serveraddr.sin_port = htons(portno);

    /* connect: create a connection with the server */
    if (connect(sockfd, &serveraddr, sizeof(serveraddr)) < 0)
        error("ERROR connecting");

    /* get message line from the user */

    printf("Connection to server:port %s:%d\n",inet_ntoa(serveraddr.sin_addr),htons(portno));
    printf("I never here here in presence of loop");

    start = clock();
    while(1){
        /* send the message line to the server */
        n = write(sockfd, buf, strlen(buf));
        if (n < 0)
            error("ERROR writing to socket");
        /* print the server's reply */
        n = read(sockfd, buf, BUFSIZE);
        if (n < 0)
            error("ERROR reading from socket");
        printf("Echo from server: %s", buf);
     }
    printf("Time taken: %ld ",clock()-start);
    close(sockfd);
    return 0;
}
/*用法:./tcp客户端主机端口*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义bufsize1024
无效错误(字符*消息){
佩罗尔(味精);
出口(0);
}
int main(int argc,字符**argv){
int sockfd,端口号,n;
serveraddr中的结构sockaddr\u;
结构主机*服务器;
字符*主机名;
字符buf[BUFSIZE];
strcpy(buf,“你好”);
时钟启动;整数计数=0;
/*检查命令行参数*/
如果(argc!=3){
fprintf(stderr,“用法:%s\n”,argv[0]);
出口(0);
}
主机名=argv[1];
portno=atoi(argv[2]);
/*套接字:创建套接字*/
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
错误(“打开套接字时出错”);
/*gethostbyname:获取服务器的DNS条目*/
服务器=gethostbyname(主机名);
如果(服务器==NULL){
fprintf(stderr,“错误,没有像%s\n这样的主机”,主机名);
出口(0);
}
/*构建服务器的Internet地址*/
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
b复制((字符*)服务器->h_地址,
(char*)&serveraddr.sin\u addr.s\u addr,server->h\u length);
serveraddr.sinu端口=htons(端口号);
/*连接:创建与服务器的连接*/
if(connect(sockfd,&serveraddr,sizeof(serveraddr))<0)
错误(“连接错误”);
/*从用户处获取消息行*/
printf(“与服务器的连接:端口%s:%d\n”,inet_ntoa(serveraddr.sin_addr),htons(portno));
printf(“我从来没有在这里出现过loop”);
开始=时钟();
而(1){
/*将消息行发送到服务器*/
n=写入(sockfd、buf、strlen(buf));
if(n<0)
错误(“写入套接字时出错”);
/*打印服务器的回复*/
n=读取(sockfd、buf、BUFSIZE);
if(n<0)
错误(“从套接字读取错误”);
printf(“来自服务器%s的回显”,buf);
}
printf(“所用时间:%ld”,时钟()-start);
关闭(sockfd);
返回0;
}
线路

printf("I never here here in presence of loop");
未显示,因为可能出现
stdout
,因此输出将不可见,直到将换行符发送到
stdout
,或刷新
stdout

如果你把它改成

printf("I never here here in presence of loop\n");

它可能会出现在您的输出中。

您所说的“在某一行之后执行”是什么意思?当问题陈述只是“它不起作用”时,很难提供解决方案。请你的问题更完整地描述一下你预期会发生什么,以及这与实际结果有什么不同。请参阅,以获取关于什么是好的解释的提示。UDP客户端在哪里?@yano UDP客户端可以很好地使用相同的for循环。因此,我没有放入代码。调用
printf()
的输出未按预期显示,原因是
format
参数字符串未以“\n”结尾,因此输出位于标准输出系统缓冲区中。