C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince

最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下:

head.h

 1 /*头文件,client和server编译时都需要使用*/
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <string.h>
 7 #include <pthread.h>
 8 #include <stdlib.h>
 9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11
12 #define MSGLEN 1000
13 #define IPLEN 15
14
15 typedef int SOCKET;

server.c:

 1 /*server*/
 2
 3 #include "head.h"
 4
 5 char msg_recv[MSGLEN], msg_send[MSGLEN];
 6 SOCKET server_sockfd, client_sockfd;
 7
 8 void *thread_function(void *argv) /*线程函数*/
 9 {
10     while(1){
11         gets(msg_send);
12         write(client_sockfd, msg_send, MSGLEN);
13     }
14     pthread_exit(NULL);
15 }
16
17 int main(int arg, char *argv[])
18 {
19     int server_len, client_len;
20     struct sockaddr_in server_address;
21     struct sockaddr_in client_address;
22     int port;
23     int res;
24
25     pthread_t a_thread;
26     void *thread_result;
27
28     if (arg != 2){
29         printf("server --portnum\n");
30         exit(EXIT_FAILURE);
31     }
32
33     sscanf(argv[1], "%d", &port); /*读入端口*/
34
35     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
36     server_address.sin_family = AF_INET;
37     server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
38     server_address.sin_port = htons(port);
39
40     server_len = sizeof(server_address);
41     bind(server_sockfd, (struct sockaddr *)&server_address, server_len); /*绑定端口并监听*/
42     listen(server_sockfd, 10);
43     printf("listen...\n");
44
45     client_len = sizeof(client_address);
46     client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
47     printf("connection success!\n");
48
49     res = pthread_create(&a_thread, NULL, thread_function, NULL); /*启动线程函数*/
50     if (res != 0){
51         perror("Thread creation failed");
52         exit(EXIT_FAILURE);
53     }
54
55     while(read(client_sockfd, msg_recv, MSGLEN)){
56         printf("msg from client: %s\n", msg_recv);
57     }
58     close(client_sockfd);
59     exit(EXIT_SUCCESS);
60 }

client.c:

 1 /*client*/
 2
 3 #include "head.h"
 4
 5 char msg_recv[MSGLEN],msg_send[MSGLEN];
 6 SOCKET sockfd;
 7
 8 void *thread_function(void *argv) /*线程函数*/
 9 {
10     while(1){
11         gets(msg_send);
12         write(sockfd, msg_send, MSGLEN);
13     }
14     pthread_exit(NULL);
15 }
16
17 int main(int arg, char *argv[])
18 {
19     struct sockaddr_in address;
20     int len;
21     int res;
22     int port;
23     char ip[IPLEN];
24
25     void *thread_result;
26     pthread_t a_thread;
27
28     sockfd = socket(AF_INET, SOCK_STREAM, 0);
29
30     if (arg != 3){
31         printf("client --ipaddress --portnum\n");
32         exit(EXIT_FAILURE);
33     }
34
35     sscanf(argv[1], "%s", ip);
36     sscanf(argv[2], "%d", &port); /*读取ip与端口*/
37
38     address.sin_family = AF_INET;
39     address.sin_addr.s_addr = inet_addr(ip);
40     address.sin_port = htons(port);
41
42     len = sizeof(address);
43     res = connect(sockfd, (struct sockaddr *)&address, len);
44     if (res == -1){
45         perror("connect failed! ");
46         exit(EXIT_FAILURE);
47     }
48     printf("connection success!\n");
49
50     res = pthread_create(&a_thread, NULL, thread_function, NULL); /*启动线程函数*/
51     if (res != 0){
52         perror("Thread creation failed");
53         exit(EXIT_FAILURE);
54     }
55
56     while(read(sockfd, msg_recv, MSGLEN)){
57         printf("msg from server: %s\n", msg_recv);
58     }
59     res = pthread_join(a_thread, &thread_result);
60     if (res != 0){
61         perror("joined failed");
62         exit(EXIT_FAILURE);
63     }
64     exit(EXIT_SUCCESS);
65 }

由于使用了线程,所以要链接正确的线程库,所以编译命令如下:

gcc -D_REENTRANT -I/usr/include/nptl server.c -o server -L/usr/lib/nptl -lpthread

gcc -D_REENTRANT -I/usr/include/nptl client.c -o client -L/usr/lib/nptl -lpthread

如果你的系统默认使用的就是NPTL线程库,那么编译时就无需加上-I和-L选项

运行时输入的命令规则是:

./server --portnum  #即server后面要加上需要绑定的端口号。

./client --ip --portnum  #即client后面要加上服务器的IP地址以及端口号。

不积跬步无以至千里,虽然这两个程序很简单,但作为我的第一个linux环境下基于socket的通信程序,也很有纪念意义。

C语言 linux环境基于socket的简易即时通信程序,布布扣,bubuko.com

时间: 2024-10-24 16:58:05

C语言 linux环境基于socket的简易即时通信程序的相关文章

第十三章:基于socket.io实现即时通信

服务器端的搭建参考socket io官网,里面有非常详细的描述,按照步骤下来,最终可以在localhost进行模拟聊天. 下面是客户端的说明. 引入socket.io.js: <script src="js/socket.io.js"></script> 定义Chats tab: <!-- Chats Tab --> <ion-tab title="Chats" icon-off="ion-ios-chatboxe

C语言 Linux环境变量

/* *@author cody *@date 2014-08-12 *@description */ /* extern char **environ //environment values #include <stdlib.h> char *getenv(const char *name); int setenv(const char *name,const char *value,int rewrite); // set enviroment if exists rewrite - 0

每天一点GO语言——Linux环境下安装Go语言环境以及编写Go语言程序初体验

每天一点GO语言--Linux环境下安装Go语言环境以及编写Go语言程序初体验 一.安装Go语言环境 [[email protected] opt]# yum -y install wget git [[email protected] opt]# wget -c https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz [[email protected] opt]# tar -zxvf go1.10.3.linux-amd64

基于Android 平台简易即时通讯的研究与设计[转]

摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:Android 平台:即时通讯 (本文中图表点击附件即可见) 1 Android 平台简介Android 是Google 公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40 多家移动通信领域的领军企业组成开放手机联盟(

基于Android平台简易即时通讯的研究与设计

1 Android平台简介 Android是Google公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40多家移动通信领域的领军企业组成开放手机联盟(OHA).Google与运营商.设备制造商.开发商和其他第三方结成深层次的合作伙伴关系,希望通过建立标准化.开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统.正因如此,Android正在被越来越多的开发者和使用者所接受.近日,Google发言人Ant

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端: #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include <sys/socket.h>#include <sys/un.h>#include <stddef.h>char buf[100];void main

Linux环境下使用eclipse开发C++动态链接库程序

Linux中也有类似windows中DLL的变成方法,只不过名称不同而已.在Linux中,动态链接叫做Standard Object,生成的动态链接文件为*.so.详细请参考相关文档. 开发环境:Eclipse 3.4.2 G++:4.3.2 1. 创建动态链接库 (1)在Eclipse中创建新的C++工程 File->New->Project->C++->C++ Project,选择Shared Library. (2)创建源代码文件 File->New->Sourc

基于Qt的局域网即时通信系统设计与实现(一)

本系统主要实现了注册登录.好友管理.即时通信(文本.视频).群组功能.消息管理.邮件收发.文件收发等主要功能.用户通过简单的注册以后,便可以登录系统.随后进行好友.群以及讨论组的添加,就可以与其他在线的用户进行行即时通信.对于消息记录,服务器以及客户端都会在各自文件或者数据库中进行相应的存储,用户可以随时进行本地消息以及网络消息的管理.当然文件的收发也得到了很好的实现,并且也集成了简单邮件收发功能. 本想分模块展示,但是要把单独模块的代码o出来,真的很麻烦,所以还是偷懒一点,直接整个来吧,不明白

linux环境基于python语言docx转pdf

windows平台因借助win32com具有多种方法将word转为pdf,但linux环境不具备此环境,win32com包也将import失败,那该如何做呢? # -*- coding: utf-8 -*- """ linux platform word to pdf """ import subprocess import os try: from comtypes import client except ImportError: clien