网络编程之socket编程实例
简单实例1
server.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
int sockfd;//服务器socket
];//客户端的socketfd,100个元素,fds[0]~fds[99]
;//用来控制进入聊天室的人数为100以内
char* IP = "0.0.0.0";
;
typedef struct sockaddr SA;
void init(){
sockfd = socket(PF_INET,SOCK_STREAM,);
){
perror("创建socket失败");
exit(-);
}
struct sockaddr_in addr;
addr.sin_family = PF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
){
perror("绑定失败");
exit(-);
}
) == -){
perror("设置监听失败");
exit(-);
}
}
void SendMsgToAll(char* msg){
int i;
;i < size;i++){
){
printf("sendto%d\n",fds[i]);
send(fds[i],msg,strlen(msg),);
}
}
}
void* service_thread(void* p){
int fd = *(int*)p;
printf("pthread = %d\n",fd);
){
] = {};
) <= ){
int i;
;i < size;i++){
if (fd == fds[i]){
fds[i] = ;
break;
}
}
printf("退出:fd = %dquit\n",fd);
pthread_exit((void*)i);
}
//把服务器接受到的信息发给所有的客户端
SendMsgToAll(buf);
}
}
void service(){
printf("服务器启动\n");
){
struct sockaddr_in fromaddr;
socklen_t len = sizeof(fromaddr);
int fd = accept(sockfd,(SA*)&fromaddr,&len);
){
printf("客户端连接出错...\n");
continue;
}
;
;i < size;i++){
){
//记录客户端的socket
fds[i] = fd;
printf("fd = %d\n",fd);
//有客户端连接之后,启动线程给此客户服务
pthread_t tid;
pthread_create(&tid,,service_thread,&fd);
break;
}
if (size == i){
//发送给客户端说聊天室满了
char* str = "对不起,聊天室已经满了!";
send(fd,str,strlen(str),);
close(fd);
}
}
}
}
int main(){
init();
service();
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
int sockfd;//客户端socket
char* IP = "192.168.1.105";//服务器的IP
;//服务器服务端口
typedef struct sockaddr SA;
];
void init(){
sockfd = socket(PF_INET,SOCK_STREAM,);
struct sockaddr_in addr;
addr.sin_family = PF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
){
perror("无法连接到服务器");
exit(-);
}
printf("客户端启动成功\n");
}
void start(){
pthread_t id;
void* recv_thread(void*);
pthread_create(&id,,recv_thread,);
] = {};
sprintf(buf2,"%s进入了聊天室",name);
send(sockfd,buf2,strlen(buf2),);
){
] = {};
scanf("%s",buf);
] = {};
sprintf(msg,"%s:%s",name,buf);
send(sockfd,msg,strlen(msg),);
){
memset(buf2,,sizeof(buf2));
sprintf(buf2,"%s退出了聊天室",name);
send(sockfd,buf2,strlen(buf2),);
break;
}
}
close(sockfd);
}
void* recv_thread(void* p){
){
] = {};
) <= ){
return;
}
printf("%s\n",buf);
}
}
int main(){
init();
printf("请输入您的名字:");
scanf("%s",name);
start();
;
}
网络编程之socket编程实例的更多相关文章
- 网络编程之Socket代码实例
网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...
- java网络编程之Socket编程
概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...
- linux网络编程之socket编程(一)
今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...
- linux网络编程之socket编程(八)
学习socket编程继续,今天要学习的内容如下: 先来简单介绍一下这五种模型分别是哪些,偏理论,有个大致的印象就成,做个对比,因为最终只会研究一个I/O模型,也是经常会用到的, 阻塞I/O: 先用一个 ...
- linux网络编程之socket编程(三)
今天继续对socket编程进行学习,在学习之前,需要回顾一下上一篇中编写的回射客户/服务器程序(http://www.cnblogs.com/webor2006/p/3923254.html),因为今 ...
- linux网络编程之socket编程(二)
今天继续对socket编程进行研究,这里会真正开如用socket写一个小例子,进入正题: TCP客户/服务器模型: 关于这个模型的流程这里就不多说了,比较容易理解,下面则利用这种模型来编写一个实际 ...
- linux网络编程之socket编程(十二)
今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...
- linux网络编程之socket编程(十一)
今天继续学习socket编程,这次主要是学习超时方法的封装,内容如下: ①.alarm[不常用,了解既可] 它的实现思路是这样的: 但是这种方案有一定的问题,因为闹钟可能会作为其它的用途,这时所设置的 ...
- linux网络编程之socket编程(十)
今天继续socket编程的学习,最近晚上睡觉都没有发热,没有暖气的日子还是种煎熬,快乐的十一也已经走来,幸福有暖气的日子也快啦,好了,回到正题~ ①close终止了数据传送的两个方向. ②shutdo ...
随机推荐
- 培训笔记——Linux目录说明
一般我们的电脑里都只有一块硬盘,但是这块硬盘怎么使用呢? 我们的头脑里大体有个分区的概念,为什么要分区呢? 不是很清楚,不过有句话说 不要把鸡蛋放在同一个篮子里,可能有这种考虑吧. 好,最起码知道分区 ...
- ubuntu16.04 docker安装
docker官网安装页面:https://docs.docker.com/engine/installation/linux/ubuntu/ 这个是ubuntu14.04 LTS需要的 $ sudo ...
- 【Flask】SelectedField 同步数据库
## 如果不加入__init__函数会导致,SelectedField表单生成只有里面的内容不会和数据库同步(即数据库添加,删除字段时表单中数据项和初始化时一致.下一次重启app是才会同步) clas ...
- vim设置tab为4空格
vim的最基础设置 vim的设置需要编辑~/.vimrc文件,更改已有设置或者在后面添加相应的设置. 设置tab为4字符 # ts: tabstop set ts=4 将tab展开为空格 # expa ...
- android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】
本文转载自:https://blog.csdn.net/zhouchengxi/article/details/53982222 这里我将U盘作为例子来说明解析. android4.1版本时U盘插拔时 ...
- mysql 主从,主主,主主复制时的主键冲突解决
原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...
- EntityFramework 学习 一 Model Browser
我们已经为School表创建第一个实体数据模型,可视化的EDM设计器不显示所有的实体,而是显示和数据库中对应的表和视图 Model Browser为你提供关于所有对象和函数的信息, Diagrams ...
- jquery 实现动态表单设计
只是实现了前台页面的动态表单的设计,并未实现后台绑定数据到数据库等功能.技术使用到的为jquery和bootstrap.俗话说有图有真相,先说下具体效果如下: 点击添加一个面板容器: 容器添加成功: ...
- EF学习 开始操作02
历史版本和未来版本 本文介绍有关实体框架 (EF5) 最新版本的信息,其中大部分内容也适用于旧版本.有关完整版本列表以及各版本引入的功能的详细信息,请参阅 “版本历史”. “历史版本”页面包含实体框架 ...
- 使用kill命令终止进程shell脚本
因有的程序使用kill才能结束掉进程,没有关闭脚本,以我司的服务为例,服务名叫asset-server服务,只有启动脚本,自编写关闭脚本,及重启动脚本. 关闭服务脚本. vim asset-shutd ...