TCP/IP网络编程 多线程服务器端的实现(1)(4)
客服端
- //
- // main.cpp
- // hello_client
- //
- // Created by app05 on 15-10-22.
- // Copyright (c) 2015年 app05. All rights reserved.
- //
- //
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define BUF_SIZE 100
- #define NAME_SIZE 20
- void * send_msg(void * arg);
- void * recv_msg(void * arg);
- void error_handling(char *message);
- char name[NAME_SIZE] = "[DEFAULT]";
- char msg[BUF_SIZE];
- int main(int argc, const char * argv[]) {
- int sock;
- struct sockaddr_in serv_addr;
- pthread_t snd_thread, rcv_thread;
- void * thread_return;
- if(argc != 4)
- {
- printf("Usage: %s \n", argv[0]);
- exit(1);
- }
- sprintf(name, "[%s]", argv[3]); //聊天人名字,配置到编译器参数里
- sock = socket(PF_INET, SOCK_STREAM, 0);
- if(sock == -1)
- error_handling("socket() error");
- memset(&serv_addr, 0, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
- serv_addr.sin_port = htons(atoi(argv[2]));
- if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1)
- error_handling("connect() error");
- //多线程分离输入和输出
- pthread_create(&snd_thread, NULL, send_msg, (void *)&sock);
- pthread_create(&rcv_thread, NULL, recv_msg, (void *)&sock);
- //阻塞,等待返回
- pthread_join(snd_thread, &thread_return);
- pthread_join(rcv_thread, &thread_return);
- close(sock);
- return 0;
- }
- //发送消息
- void * send_msg(void * arg)
- {
- int sock = *((int *)arg);
- char name_msg[NAME_SIZE + BUF_SIZE];
- while (1) {
- fgets(msg, BUF_SIZE, stdin);
- if (!strcmp(msg, "q\n") || !strcmp(msg, "Q \n")) {
- close(sock);
- exit(0);
- }
- sprintf(name_msg, "%s %s", name, msg);
- write(sock, name_msg, strlen(name_msg));
- }
- return NULL;
- }
- //接收消息
- void * recv_msg(void * arg)
- {
- int sock = *((int *)arg);
- char name_msg[NAME_SIZE + BUF_SIZE];
- int str_len;
- while (1) {
- str_len = read(sock, name_msg, NAME_SIZE + BUF_SIZE - 1);
- if(str_len == -1)
- return (void *)-1;
- name_msg[str_len] = 0;
- fputs(name_msg, stdout);
- }
- return NULL;
- }
- void error_handling(char *message)
- {
- fputs(message, stderr);
- fputc('\n', stderr);
- exit(1);
- }
评论暂时关闭