Linux socket网络编程基础 tcp和udp
Socket TCP网络通信编程
首先,服务器端需要做以下准备工作:
(1)调用socket()函数。建立socket对象,指定通信协议。
(2)调用bind()函数。将创建的socket对象与当前主机的某一个IP地和端口绑定。
(3)调用listen()函数。使socket对象处于监听状态,并设置监听队列大小。
客户端需要做以下准备工作:
(1)调用socket()函数。建立socket()对象,指定相同通信协议。
(2)应用程序可以显式的调用bind()函数为其绑定IP地址和端口,当然,也可以将这工作交给TCP/IP协议栈。
接着建立通信连接:
(1)客户端调用connect()函数。向服务器端发出连接请求。
(2)服务端监听到该请求,调用accept()函数接受请求,从而建立连接,并返回一个新的socket文件描述符专门处理该连接。
然后通信双方发送/接收数据:
(1)服务器端调用write()或send()函数发送数据,客户端调用read()或者recv()函数接收数据。反之客户端发送数据,服务器端接收数据。
(2)通信完成后,通信双方都需要调用close()或者shutdown()函数关闭socket对象。
类比电话通信,面向连接的socket通信实现图

展示一个代码示例:
服务端:
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>
#include <arpa/inet.h>
#include<pthread.h>
static void usage(const char *proc)
{
printf("Please use :%s [IP] [port]\n",proc);
}
void thread_run(void *arg)
{
printf("creat a new thread\n");
int fd = (int)arg;
];
){
memset(buf,'\0',sizeof(buf));
ssize_t _s = read(fd,buf,);
){
buf[_s] = '\0';
printf("client say : %s\n",buf);
}
memset(buf,'\0',sizeof(buf));
printf("please Enter: ");
fflush(stdout);
ssize_t _s2 = read(,buf,);
){
write(fd,buf,strlen(buf));
}
}
}
int main(int argc,char *argv[])
{
){
usage(argv[]);
exit();
}
//1.creat socket
);
){
perror("creat socket error\n");
;
}
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(atoi(argv[]));
local.sin_addr.s_addr = inet_addr(argv[]);
//2.bind
){
perror("bind error\n");
close(sock);
;
}
//3.listen
) < ){
perror("listen error\n");
close(sock);
;
}
printf("bind and listen success!wait accept...\n");
//4.accept
struct sockaddr_in peer;
socklen_t len = sizeof(peer);
){
int fd = accept(sock,(struct sockaddr*)&peer ,&len);
){
perror("accept error\n");
close(sock);
;
}
printf("get connect,ip is : %s port is : %d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
pthread_t id;
pthread_create(&id,NULL,thread_run,(void*)fd);
pthread_detach(id);
}
close(sock);
;
}
客户端:
#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<arpa/inet.h>
static void usage(const char *proc)
{
printf("please use : %s [ip] [port]\n",proc);
}
int main(int argc,char *argv[])
{
){
usage(argv[]);
exit();
}
);
){
perror("socket error");
;
}
struct sockaddr_in remote;
remote.sin_family = AF_INET;
remote.sin_port = htons(atoi(argv[]));
remote.sin_addr.s_addr = inet_addr(argv[]);
int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote));
){
printf("connect failed:%s\n",strerror(errno));
;
}
printf("connect success!\n");
];
){
memset(buf,'\0',sizeof(buf));
printf("please enter:");
fflush(stdout);
ssize_t _s = read(,buf,);
){
buf[_s - ] = '\0';
write(sock,buf,strlen(buf));
_s = read(sock,buf,);
){
) == ){
printf("qiut\n");
break;
}
buf[_s -] = '\0';
printf("%s\n",buf);
}
}
}
close(sock);
;
}
UDP网络通信编程
客户不与服务器建立链接,而是管使用sendto函数给服务器发送数据报,其中必须指定目的地址(即服务器地址)作为参数。类似的,服务器不接受来自客户的连接,而只管调用
revcfrom函数等待来自某个客户数据的到达。revcfrom将与所接受到的数据报一道返回客户的协议地址,因此服务器可以把响应发送给正确的客户。

//服务端代码示例:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
int main(int argc,char *argv[])
{
){
printf(]);
;
}
);
){
perror("socket error");
;
}
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(atoi(argv[]));
local.sin_addr.s_addr = inet_addr(argv[]);
){
perror("bind error");
;
}
;
struct sockaddr_in peer;
socklen_t len = sizeof(peer);
];
while(!done){
memset(buf,'\0',sizeof(buf));
recvfrom(sock,buf,,(struct sockaddr*)&peer,&len);
printf("#########################\n");
printf("get a client,socket: %s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
printf("client : %s ,echo client!\n",buf);
printf("#########################\n");
sendto(sock,buf,,(struct sockaddr*)&peer,len);
}
;
}
Linux socket网络编程基础 tcp和udp的更多相关文章
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2
BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础
IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4
网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 2 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 3
使用之前的函数实现的简单聊天程序 TCP协议 双方实时发送/接收消息 实现后的问题: 可能是我虚拟机的IP地址配得有问题吧.在一台电脑上面开两个终端,用127.0.0.1的IP收发可以互通.但是两个虚 ...
- 嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...
- python全栈开发从入门到放弃之socket网络编程基础
网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
随机推荐
- XML (一)
1 XML概述 XML是指可扩展的标记语言,很类似与HTML.它被设计的宗旨就是描述数据,而非显示数据. XML标签没有被预定义,需要用户自定定义标签. XML技术是W3C组织发布的.目前遵循的规范是 ...
- Python类的__getitem__和__setitem__特殊方法
class testsetandget: kk = {}; def __getitem__(self, key): return self.kk[key]; ...
- 【转】UNIX时间戳与.net日期类的转换
1 将系统时间转换成UNIX时间戳 DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1)); ...
- TP5 常用-方法技巧
1.插入数据成功返回该数据的ID $add=db('user')->insertGetId($data); //insert($data) 方法获得是插入数据返回的影响条数 2.使用重定 ...
- 第一个jdbc
1. jdbc就是java提供连接数据库的规范.在java中就是一套接口.实现这套接口的这套类就是数据库驱动,用数据库驱动才能连接数据库. 2. Junit是为了方便测试的技术手段,在测试时,一个类中 ...
- Directx3d绘制包围体并控制光照效果
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- centos 6.5静态网址简单配置
详细配置参数参考如下: DEVICE=eth0HWADDR=08:00:27:F1:72:C9TYPE=EthernetUUID=dab98425-fa46-4a5b-8f47-cf846d4acb3 ...
- firefox在引入vue.js后不支持e=e||window.event的解决办法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- rsync实现数据增量备份
环境说明: 主机ip:192.168.0.201 需备份的目录:/opt/mail 备份机器ip:192.168.0.215 1.编辑/etc/rsyncd.conf文件(etc目录不存在的话,需要手 ...
- 2018/2/11 ELK技术栈之ElasticSearch学习笔记二
终于有时间记录一下最近学习的知识了,其实除了写下的这些还有很多很多,但懒得一一写下了: ElasticSearch添加修改删除原理:ElasticSearch的倒排索引和文档一旦生成就不允许修改(其实 ...