繁体   English   中英

在线程和套接字编程中使用printf

[英]Using printf with threads and socket programming

我当时正在使用套接字编程制作一台服务器,该服务器响应客户端对他说的话。 但是,当我打印出消息(由客户端发送)及其长度时,消息及其长度不匹配。 我正在使用printf进行打印。

我基本上想要的是在客户端键入“ exit”时关闭连接。 但是strcmp(“ exit”,clientmessage)无法正常工作。

服务器代码:

//for running type ./a.out anyportnumber
#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 <pthread.h>

void *function(void *s)
{
    int s1;
    int n;
    char rmsg[500];
    s1 = *(int *)s;
    while((n = read(s1,rmsg,499)) > 0) {
        rmsg[n] = '\0';
        printf("%s %d\n",rmsg,strlen(rmsg));
        bzero(rmsg,499);
    }
    pthread_exit(NULL);
}
int main(int arrc,char *argv[])
{
    struct sockaddr_in server,client;
    int s1,len;
    int s2;
    int n;
    int i = 0;
    int port;
    pthread_t t1;
    char message[500];
    port = atoi(argv[1]);
    bzero((char *)&server,sizeof(server));
    server.sin_port = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_family = AF_INET;
    s1 = socket(AF_INET,SOCK_STREAM,0);
    if(s1 == -1) {
        perror("socket not created\n");
        exit(1);
    }
    if(bind(s1,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {
        perror("socket not binded\n");
        exit(1);
    }
    if(listen(s1,5) == -1) {
        perror("unable to listen");
        exit(1);
    }
    len = sizeof(struct sockaddr_in);
    s2 = accept(s1,(struct sockaddr *)&client,&len);
    pthread_create(&t1,NULL,function,(void *)&s2);
    pthread_join(t1,NULL);
    close(s2);
    close(s1);
    return 0;

}

客户端输入:

shivam@shivam-HP-Pavilion-15-Notebook-PC:~$ telnet localhost 8009
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hhh
jhiklmnop

服务器端输出:

shivam@shivam-HP-Pavilion-15-Notebook-PC:~/Study/chat$ ./a.out 8009
hhh
 5
jhiklmnop
 11

编辑代码:

//for running type ./a.out anyportnumber
#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 <pthread.h>
void *function(void *s)
{
    int s1;
    int n;
    char rmsg[500];
    s1 = *(int *)s;
    char d[] = {'e','x','i','t','\0'};
    while((n = read(s1,rmsg,499)) > 0) {
        rmsg[n-2] = '\0';
        if(strcmp(d,rmsg) == 0) {
            write(s1,"bye",3);
            close(s1);
        }
        rmsg[n-2] = '\n';
        rmsg[n-1] = '\0';
        write(s1,rmsg,strlen(rmsg));
        bzero(rmsg,499);
    }
    pthread_exit(NULL);
}
int main(int arrc,char *argv[])
{
    struct sockaddr_in server,client;
    int s1,len;
    int s2;
    int n;
    int i = 0;
    int port;
    pthread_t t1;
    char message[500];
    port = atoi(argv[1]);
    bzero((char *)&server,sizeof(server));
    server.sin_port = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_family = AF_INET;
    s1 = socket(AF_INET,SOCK_STREAM,0);
    if(s1 == -1) {
        perror("socket not created\n");
        exit(1);
    }
    if(bind(s1,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {
        perror("socket not binded\n");
        exit(1);
    }
    if(listen(s1,5) == -1) {
        perror("unable to listen");
        exit(1);
    }
    len = sizeof(struct sockaddr_in);
    s2 = accept(s1,(struct sockaddr *)&client,&len);
    pthread_create(&t1,NULL,function,(void *)&s2);
    pthread_join(t1,NULL);
    close(s2);
    close(s1);
    return 0;

}

TCP是面向流的协议,没有消息边界。 因此,您无法在执行操作时编写依赖于read()返回值的应用程序逻辑。

解决方法是使用带前缀的字符串或通过套接字发送NUL终结符。 您也可以构想其他机制,但是客户端必须在数据流中告诉服务器消息的结束位置。 TCP层不会那样做。

除了用户输入的字符外,当用户按下Enter键时,您还将获得回车符(0xd)和换行符(0xa)。 这就是为什么您要得到比预期大2的数字的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM