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 -lpthreadgcc -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的通信程序,也很有纪念意义。

转载于:https://www.cnblogs.com/kevince/p/3891033.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云cloudlite认证_【腾讯云】考个证...大数据开发工程师认证

作为一个大数据行业的从业者&#xff0c;考个腾讯云大数据开发工程师认证总比考个消防证 easy 吧…&#xff1f;关于考这个认证的意义其实主要在于全面复习一下大数据相关的知识点&#xff0c;另外有个腾讯云的认证&#xff0c;也许大概也会对你找工作有点帮助的吧&#xff1f;…

Logistic回归主要应用领域

主要应用领域 1、预测是否发生、发生的概率&#xff08;流失、客户响应等预测&#xff09; 如果已经建立了logistic回归模型&#xff0c;则可以根据模型&#xff0c;预测在不同的自变量情况下&#xff0c;发生某病或某种情况的概率有多大。 2、影响因素、危险因素分析&#xff…

Java Process.waitFor()这个方法是做什么用的

java.lang.Process.waitFor()方法将导致当前的线程等待&#xff0c;如果必要的话&#xff0c;直到由该Process对象表示的进程已经终止。此方法将立即返回&#xff0c;如果子进程已经终止。如果子进程尚未终止&#xff0c;则调用线程将被阻塞&#xff0c;直到子进程退出。public…

kernel shell bash简介

还记得我们在Linux启动的时候。首先会启动内核 (kernel)&#xff0c;内核是一段计算机程序&#xff0c;这个程序直接管理管理硬件&#xff0c;包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。为了我们方便调用内核&#xff0c;我们将内核…

最高调恋爱方式,简直“公开处刑”......

1 我拿到了剑桥的offer...▼2 当空乘专业第一次穿高跟鞋...▼3 是我没错了▼4 笑出鹅叫▼5 现场表演一下&#xff0c;一秒落汤鸡&#xff01;▼6 那个红/黄毛起来一下&#xff01;▼7 最高调的恋爱方式▼7 数学可以多好玩▼你点的每个赞&#xff0c;我都认真当成了喜欢

oracle6

概要文件管理用户资源create profile profile_name limitselect * from dba_profiles where profile order by limit;口令管理select * from dba_profiles where profile and resource_typepassword口令验证函数直接执行概要文件D:\app\Administrator\product\11.1.0\db_1\RDBM…

C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件

01—概述ObservableCollection继承了INotifyPropertyChanged接口&#xff0c;在属性变更时可以通知界面&#xff0c;当我把ObservableCollection集合绑定到界面的DataGrid后&#xff0c;我希望在界面修改表格数值后&#xff0c;可以触发一个 事件来验证我界面设定数据的有效性&…

数据挖掘算法之决策树算法总结

机器学习中&#xff0c;决策树是一个预测模型&#xff1b;它代表的是对象属性值与对象值之间的一种映射关系。树中每个节点表示某个对象&#xff0c;每个分叉路径则代表的某个可能的属性值&#xff0c;而每个叶结点则对应具有上述属性值的子对象。决策树仅有单一输出&#xff1…

微软职位内部推荐-SDEII

微软近期Open的职位:JD如果你想试试这个职位&#xff0c;请跟我联系&#xff0c;我是微软的员工&#xff0c;可以做内部推荐。发你的中英文简历到我的邮箱&#xff1a;Nicholas.lu.mail(at)gmail.com转载于:https://www.cnblogs.com/DotNetNuke/p/3891832.html

win7升级win10正式版_win7告退在即,如何升级到win10?

Win7即将停更&#xff0c;小伙伴们也差不多要进行自己系统的更新啦&#xff0c;今天小白就教大家如何将Win7升级到Win10第一步&#xff1a;首先在官网 www.xiaobaixitong.com 下载“小白软件”第二步&#xff1a;选好我们要下载的系统&#xff0c;然后安装即可。第三步&#xf…

C++容器的insert()函数有以下三种用法: 最终*it=val;

C容器的insert()函数有以下三种用法: 最终*itval; //用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器, iterator insert( iterator it, const TYPE &val ); //用法2:在指定位置it前“插入”num个值为val的元素 void insert( iterator it, si…

在24小时内学完所有的数学是种什么体验?我们做了这个大胆的尝试……

全世界只有3.14 % 的人关注了爆炸吧知识人还好就是没了而已其实&#xff0c;在此时&#xff0c;还有一件事情发生了。22:00&#xff0c;我们发出了这篇文章&#xff0c;不仅将2600多年的数学简史浓缩成24小时&#xff0c;还将2600多年数学简史浓缩成54张卡牌。每张卡牌背后都有…

Server Develop (八) IOCP模型

IOCP模型 IOCP全称I/O Completion Port&#xff0c;中文译为I/O完成端口。IOCP是一个异步I/O的Windows API&#xff0c;它可以高效地将I/O事件通知给应用程序&#xff0c;类似于Linux中的Epoll。 简介 IOCP模型属于一种通讯模型&#xff0c;适用于Windows平台下高负载服务器的一…

理解RESTful架构

2019独角兽企业重金招聘Python工程师标准>>> 原文&#xff1a;http://www.ruanyifeng.com/blog/2011/09/restful.html?20160826000527 越来越多的人开始意识到&#xff0c;网站即软件&#xff0c;而且是一种新型的软件。 这种"互联网软件"采用客户端/服务…

凡是过往,皆为序章。

凡是过往&#xff0c;皆为序章今天是元旦假期的最后一天&#xff0c;这三天我一直在想&#xff0c;21年的年终总结应该如何下笔。其实心里面想表达和记录的事情很多&#xff0c;可当真正坐在电脑前时&#xff0c;却发现没有头绪。贵有恒&#xff0c;何必三更起五更眠。最无益&a…

大数求和

描述: 给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B; 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 输入: 因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。 输出: 以字符串形式,输出…

[转]Myeclipse9引入easy_ui时,其中的部分js文件报错

博客原文http://blog.csdn.net/simplty/article/details/7661504转载于:https://www.cnblogs.com/Bird-Man/p/3897045.html

《SAS编程与数据挖掘商业案例》学习笔记之八

十&#xff1a;file语句 file中的option选项&#xff1a; Dlm 指定列表输出文件的分隔符&#xff0c;默认是空格 Dropover 规定当输出数据行长度超过指定值时&#xff0c;忽略超出部分 Flowover 规定当输出数据行长度超过指定值时&#xff0c;超过部分在下…

查看操作系统版本linux_LINUX操作系统常用操作收录(二):查看文件内容命令小结...

先整体了解一下如何查看文件内容的命令vi 兼有修改功能的查看方式&#xff0c;会单独打开整个文件vim 可修改文件内容并且显示当前查看位置在文件中的%多少cat 由第一行开始显示内容&#xff0c;并将所有内容输出tac 从最后一行倒序显示内容&#xff0c;并将所有内容输出more…