linux gcc下实现简单socket套接字小程序
服务端代码如下:
//服务端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
//捕获子进程退出信号,在退出时给出提示
void sig_handler(int signo)
{
pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
while(pid>0){
printf("子进程结束 (PID:%ld)\n",(long)getpid());
pid=waitpid(-1,&stat,WNOHANG);
}
}
int main(int argc,char *argv[])
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[1024];
int len;
int port;
pid_t pid;
struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr;
//提示
if (argc!=2){
printf("exp: %s port\n",argv[0]);
return 1;
}
port=atoi(argv[1]);
//设置信号处理函数
if(signal(SIGCHLD,sig_handler)<0){
perror("cannot set the signal");
return 1;
}
//设置套接字监听
listen_fd=socket(PF_INET,SOCK_STREAM,0);
if(listen_fd<0){
perror("不能创建套接字监听!");
return 1;
}
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
srv_addr.sin_port=htons(port);
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret == -1){
perror("不能捆绑端口");
close(listen_fd);
return 1;
}
//监听指定端口,连接5个客户端
ret=listen(listen_fd,5);
if(ret==-1){
perror("不能监听端口");
close(listen_fd);
return 1;
}
while (1){
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0){
if(errno == EINTR){
continue;
}else{
perror("不能返回结果");
close(listen_fd);
return 1;
}
}
pid=fork();//多进程
if(pid<0){
perror("不能创建子进程!");
close(listen_fd);
return 1;
}else if(pid == 0){
while((len=read(com_fd,recv_buf,1024))>0){
printf("连接端信息:(%d):%s\n",len,recv_buf);
if(recv_buf[0]=='@')
break;
for(i=0;i<len;i++)
recv_buf[i]=toupper(recv_buf[i]);
write(com_fd,recv_buf,len);
}
close(com_fd);
return 0;
}else
close(com_fd);
}
return 0;
}
客户端代码如下:
//客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int connect_fd;
int ret;
char snd_buf[1024];
int i;
int port;
int len;
static struct sockaddr_in srv_addr;
if(argc!=3){
printf("exp: %s server_ip port\n",argv[0]);
return 1;
}
port=atoi(argv[2]);
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0){
perror("Cannot create communication socket");
return 1;
}
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//连接到服务器
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1){
perror("Cannot connect to the server");
close(connect_fd);
return 1;
}
memset(snd_buf,0,1024);
while(1){
write(STDOUT_FILENO,"In put some Message",14);
len=read(STDIN_FILENO,snd_buf,1024);
if(len>0)
write(connect_fd,snd_buf,len);
len=read(connect_fd,snd_buf,len);
if(len>0)
printf("The message from Server %s\n",snd_buf);
if(snd_buf[0] == '@')
break;
}
close(connect_fd);
return 0;
}
运行如下图:
代码来自《LINUX编程技术详解》。PS:Vim快把电脑的空格键用坏了,囧。
转载于:https://www.cnblogs.com/myphoebe/archive/2011/08/26/2154050.html
linux gcc下实现简单socket套接字小程序相关推荐
- java实现套接字网络编程_Java网络编程(一)Socket套接字
一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...
- Java网络编程(一)Socket套接字
一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...
- linux下使用fread读socket套接字的注意点
linux下使用fread读socket套接字的注意点 linux总所周知,一切皆文件.因此我们在读写文件时觉得fread,recv这些可以随便用.下面看看有哪些注意事项呢. 因为C库的文件处理函数较 ...
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...
- linux 服务器间通信,Linux 下的进程间通信:套接字和信号 | Linux 中国
原标题:Linux 下的进程间通信:套接字和信号 | Linux 中国 学习在 Linux 中进程是如何与其他进程进行同步的. -- Marty Kalin 本篇是 Linux 下(IPC)系列的第三 ...
- 一个简单的socket套接字服务器,Python
(1)用Python实现一个简单的套接字socket服务器例子,该服务器在接受客户端连接后,每隔一秒从a到z的字符中随机选一个发送给客户端. import socketserver import ti ...
- Linux网络编程之Socket套接字
一.Socket到底是什么 socket 这个英文单词的原意是"插口""插槽", 在网络编程中,它的意思是可以通过插口接入的方式,快速完成网络连接和数据收发.你 ...
- LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .
const int udp_recvbufsize = 384 * 1024 ; int result = ::setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, ...
- 【Linux网络编程】网络基础 和 socket套接字 服务器与客户端 详细案例说明
目录 前言 一.网络编程三要素 1.IP地址 2.通信协议 3.端口号 二.SOCKET套接字 SOCKET概述 SOCKET分类 三.代码实现 1.编程思路 2.建立服务器 服务器完整代码 3.建立 ...
- alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)
alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...
最新文章
- C#调用C++ dll类型对照表汇总
- apache 开启Gzip网页压缩
- CFNet:End-to-end representation learning for Correlation Filter based tracking
- 六、Scrapy中Download Middleware的用法
- GG and MM(every sg 游戏)
- 欢乐纪中某A组赛【2019.7.12】
- 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>
- pdf怎么打开上次看到的地方_ppt如何转pdf?俩种方法轻松搞定
- 被吐槽得最惨的10大专业,计算机专业亮了
- mysql 创建用户并赋予用户权限
- Windows环境bugfree搭建
- Android群英传知识点回顾——第七章:Android动画机制与使用技巧
- 余承东说华为OS操作系统最快今秋面市,真的能承受之重吗??
- Android 子线程更新UI
- 模拟扑克牌的洗牌发牌
- 基于宜搭的《T恤尺码收集》应用搭建
- oracle例外使用
- 《拖延症心理学》读感
- [转载]Win7中的页目录
- 高仿糗事百科,完整版项目源码,带服务器部分
热门文章
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_5_综合案例_文件搜索...
- Mysql两个引擎对比
- Jquery实现循环删除Reaper某一行
- 【面试题总结】1、统计字符串中某个单词出现的次数(1-C++实现)
- [BZOJ]4127: Abs
- c#实现程序的互斥运行
- 123 Python程序中的线程操作-协程
- DRL前沿之:Benchmarking Deep Reinforcement Learning for Continuous Control
- docker容器启动失败解决办法
- Codeforces Round #453 (Div. 1)