服务端代码如下:

//服务端

#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套接字小程序相关推荐

  1. java实现套接字网络编程_Java网络编程(一)Socket套接字

    一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...

  2. Java网络编程(一)Socket套接字

    一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...

  3. linux下使用fread读socket套接字的注意点

    linux下使用fread读socket套接字的注意点 linux总所周知,一切皆文件.因此我们在读写文件时觉得fread,recv这些可以随便用.下面看看有哪些注意事项呢. 因为C库的文件处理函数较 ...

  4. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  5. linux 服务器间通信,Linux 下的进程间通信:套接字和信号 | Linux 中国

    原标题:Linux 下的进程间通信:套接字和信号 | Linux 中国 学习在 Linux 中进程是如何与其他进程进行同步的. -- Marty Kalin 本篇是 Linux 下(IPC)系列的第三 ...

  6. 一个简单的socket套接字服务器,Python

    (1)用Python实现一个简单的套接字socket服务器例子,该服务器在接受客户端连接后,每隔一秒从a到z的字符中随机选一个发送给客户端. import socketserver import ti ...

  7. Linux网络编程之Socket套接字

    一.Socket到底是什么 socket 这个英文单词的原意是"插口""插槽", 在网络编程中,它的意思是可以通过插口接入的方式,快速完成网络连接和数据收发.你 ...

  8. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .

    const int udp_recvbufsize = 384 * 1024 ; int result = ::setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, ...

  9. 【Linux网络编程】网络基础 和 socket套接字 服务器与客户端 详细案例说明

    目录 前言 一.网络编程三要素 1.IP地址 2.通信协议 3.端口号 二.SOCKET套接字 SOCKET概述 SOCKET分类 三.代码实现 1.编程思路 2.建立服务器 服务器完整代码 3.建立 ...

  10. alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)

    alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...

最新文章

  1. C#调用C++ dll类型对照表汇总
  2. apache 开启Gzip网页压缩
  3. CFNet:End-to-end representation learning for Correlation Filter based tracking
  4. 六、Scrapy中Download Middleware的用法
  5. GG and MM(every sg 游戏)
  6. 欢乐纪中某A组赛【2019.7.12】
  7. 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>
  8. pdf怎么打开上次看到的地方_ppt如何转pdf?俩种方法轻松搞定
  9. 被吐槽得最惨的10大专业,计算机专业亮了
  10. mysql 创建用户并赋予用户权限
  11. Windows环境bugfree搭建
  12. Android群英传知识点回顾——第七章:Android动画机制与使用技巧
  13. 余承东说华为OS操作系统最快今秋面市,真的能承受之重吗??
  14. Android 子线程更新UI
  15. 模拟扑克牌的洗牌发牌
  16. 基于宜搭的《T恤尺码收集》应用搭建
  17. oracle例外使用
  18. 《拖延症心理学》读感
  19. [转载]Win7中的页目录
  20. 高仿糗事百科,完整版项目源码,带服务器部分

热门文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_5_综合案例_文件搜索...
  2. Mysql两个引擎对比
  3. Jquery实现循环删除Reaper某一行
  4. 【面试题总结】1、统计字符串中某个单词出现的次数(1-C++实现)
  5. [BZOJ]4127: Abs
  6. c#实现程序的互斥运行
  7. 123 Python程序中的线程操作-协程
  8. DRL前沿之:Benchmarking Deep Reinforcement Learning for Continuous Control
  9. docker容器启动失败解决办法
  10. Codeforces Round #453 (Div. 1)