最近做的东西与socket十分紧密,所以很好奇它具体是如何实现的,以前也有了解过,但是又忘记了,于是把它记录下来,以便日后查看。

服务器端:server.c

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h> #define MYPORT 8887
#define QUEUE 20
#define BUFFER_SIZE 1024 int main()
{
///定义sockfd
int server_sockfd = socket(AF_INET,SOCK_STREAM, ); ///定义sockaddr_in
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(MYPORT);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出错返回-1
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-)
{
perror("bind");
exit();
} ///listen,成功返回0,出错返回-1
if(listen(server_sockfd,QUEUE) == -)
{
perror("listen");
exit();
} ///客户端套接字
char buffer[BUFFER_SIZE];
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr); ///成功返回非负描述字,出错返回-1
int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
if(conn<)
{
perror("connect");
exit();
} while()
{
memset(buffer,,sizeof(buffer));
int len = recv(conn, buffer, sizeof(buffer),);
if(strcmp(buffer,"exit\n")==)
break;
fputs(buffer, stdout);
send(conn, buffer, len, );
}
close(conn);
close(server_sockfd);
return ;
}

客户端:client.c

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h> #define MYPORT 8887
#define BUFFER_SIZE 1024 int main()
{
///定义sockfd
int sock_cli = socket(AF_INET,SOCK_STREAM, ); ///定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT); ///服务器端口
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///服务器ip ///连接服务器,成功返回0,错误返回-1
if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < )
{
perror("connect");
exit();
} char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
{
send(sock_cli, sendbuf, strlen(sendbuf),); ///发送
if(strcmp(sendbuf,"exit\n")==)
break;
recv(sock_cli, recvbuf, sizeof(recvbuf),); ///接收
fputs(recvbuf, stdout); memset(sendbuf, , sizeof(sendbuf));
memset(recvbuf, , sizeof(recvbuf));
} close(sock_cli);
return ;
}

最新文章

  1. Castle ActiveRecord框架学习(二):快速搭建简单博客网站
  2. Codeforces Round #285 (Div.1 B &amp; Div.2 D) Misha and Permutations Summation --二分+树状数组
  3. ffmpeg-20160325-snapshot-static-bin
  4. 二分套二分 hrbeu.acm.1211Kth Largest
  5. android:sharedUserId 获取系统权限
  6. soem函数库的编译
  7. python3爬虫初探(二)之requests
  8. C#画图解决闪烁问题
  9. MBProgressHUD 问题
  10. IO (二)
  11. struts2 上传与下载
  12. javaweb中上传视频,并且播放,用上传视频信息为例
  13. fiddler抓取https失败解决方案
  14. Prim算法、Kruskal算法和最小生成树 | Minimum Spanning Tree
  15. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
  16. day5_函数的参数
  17. Here’s just a fraction of what you can do with linear algebra
  18. Run-Time Check Failure #2 Stack around the variable ‘xxx’ was corrupted
  19. jmxtrans
  20. linux 目录结构(转)

热门文章

  1. SQLServer低版本附加高版本的数据库常用处理方法
  2. Service Worker基础知识整理
  3. OpenCV 初体验
  4. 客户端浏览器- UWP兼容版本WebView
  5. JavaScript是如何工作的:引擎,运行时和调用堆栈的概述!
  6. Android View的重绘过程之Measure
  7. Git - git branch - 查看本地仓分支列表
  8. VUE新版扫码下单必选分类设置FAQ
  9. C#零基础入门-2-Visual Studio (VS)程序初始化及各组成部分
  10. 字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion