[转][linux]简单的linux下的tcp/udp
转自:https://blog.csdn.net/cabing2005/article/details/53068880
详细函数以及参数解释请看原链接。
windows下的tcp/udp参考:http://www.cnblogs.com/lyggqm/p/6558002.html
TCP SERVER:
//
// main.cpp
// linux_socket_api
//
// Created by bikang on 16/11/2.
// Copyright (c) 2016年 bikang. All rights reserved.
// #include <iostream> #include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h> //using namespace std; #define BUFFER_SIZE 1024 void tsocket(int argc, const char * argv[]); int main(int argc, const char * argv[]) {
tsocket(argc,argv);
return ;
}
void tsocket(int argc, const char * argv[]){
if(argc < ){
exit(-);
} const char* ip = argv[];
int port = atoi(argv[]);
int backlog = atoi(argv[]); std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog << std::endl; int fd;
int check_ret; fd = socket(PF_INET,SOCK_STREAM , );
assert(fd >= ); struct sockaddr_in address;
bzero(&address,sizeof(address)); //转换成网络地址
address.sin_port = htons(port);
address.sin_family = AF_INET;
//地址转换
inet_pton(AF_INET, ip, &address.sin_addr);
//设置socket buffer大小
int recvbuf = ;
int len = sizeof( recvbuf );
setsockopt( fd, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof( recvbuf ) );
getsockopt( fd, SOL_SOCKET, SO_RCVBUF, &recvbuf, ( socklen_t* )&len );
printf( "the receive buffer size after settting is %d\n", recvbuf ); //绑定ip和端口
check_ret = bind(fd,(struct sockaddr*)&address,sizeof(address));
assert(check_ret >= ); //创建监听队列,用来存放待处理的客户连接
check_ret = listen(fd, backlog);
assert(check_ret >= ); struct sockaddr_in addressClient;
socklen_t clientLen = sizeof(addressClient);
//接受连接,阻塞函数
int connfd = accept(fd, (struct sockaddr*)&addressClient, &clientLen);
if(connfd < ){
std::cout << "accept error";
}else{
//打印客户端信息
char showData[INET_ADDRSTRLEN];
std::cout <<inet_ntop(AF_INET,&addressClient.sin_addr,showData,INET_ADDRSTRLEN)<<":" <<ntohs(addressClient.sin_port)<<std::endl; //接受数据
const int BUF_LEN = ;
char sockBuf[BUF_LEN];
size_t ret; memset(sockBuf, '\0', BUF_LEN);
ret = recv(connfd, sockBuf, BUF_LEN-, );
printf("ret=%ld,msg=%s\n",ret,sockBuf); memset(sockBuf, '\0', BUF_LEN);
ret = recv(connfd, sockBuf, BUF_LEN-, MSG_OOB);
printf("ret=%ld,msg=%s\n",ret,sockBuf); memset(sockBuf, '\0', BUF_LEN);
ret = recv(connfd, sockBuf, BUF_LEN-, );
printf("ret=%ld,msg=%s\n",ret,sockBuf); //获取本地socket信息
struct sockaddr_in tmpAddress;
clientLen = sizeof(tmpAddress);
getsockname(fd, (struct sockaddr*)&tmpAddress, &clientLen);
std::cout <<inet_ntop(AF_INET,&tmpAddress.sin_addr,showData,INET_ADDRSTRLEN)<<":" <<ntohs(tmpAddress.sin_port)<<std::endl;
//获取远端socket信息
getpeername(connfd,(struct sockaddr*)&tmpAddress, &clientLen );
std::cout <<inet_ntop(AF_INET,&tmpAddress.sin_addr,showData,INET_ADDRSTRLEN)<<":" <<ntohs(tmpAddress.sin_port)<<std::endl; close(connfd);
} close(fd);
}
TCP CLIENT:
//
// main.cpp
// linux_socket_api_client
//
// Created by bikang on 16/11/2.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#include <iostream> #include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h> void tserver(int argc, const char * argv[]); int main(int argc, const char * argv[]) {
tserver(argc,argv);
return ;
}
void tserver(int argc, const char * argv[]){
std::cout << "t server" << std::endl;
if(argc < ){
exit(-);
} const char* ip = argv[];
int port = atoi(argv[]);
int backlog = atoi(argv[]); std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog << std::endl; int fd;
int check_ret; fd = socket(PF_INET,SOCK_STREAM , );
assert(fd >= ); int sendbuf = ;
int len = sizeof( sendbuf );
setsockopt( fd, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof( sendbuf ) );
getsockopt( fd, SOL_SOCKET, SO_SNDBUF, &sendbuf, ( socklen_t* )&len );
printf( "the send buffer size after settting is %d\n", sendbuf ); struct sockaddr_in address;
bzero(&address,sizeof(address)); //转换成网络地址
address.sin_port = htons(port);
address.sin_family = AF_INET;
//地址转换
inet_pton(AF_INET, ip, &address.sin_addr);
check_ret = connect(fd, (struct sockaddr*) &address, sizeof(address));
assert(check_ret >= );
//发送数据
const char* oob_data = "abc";
const char* normal_data = "my boy!"; send(fd, normal_data, strlen(normal_data), );
send(fd, oob_data, strlen(oob_data), MSG_OOB);
send(fd, normal_data, strlen(normal_data), ); close(fd);
}
UDP SERVER:
#include <iostream> #include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h> //using namespace std; #define BUFFER_SIZE 1024 void tsocket(int argc, const char * argv[]); int main(int argc, const char * argv[]) {
tsocket(argc,argv);
return ;
}
void tsocket(int argc, const char * argv[]){
if(argc < ){
exit(-);
} const char* ip = argv[];
int port = atoi(argv[]);
int backlog = atoi(argv[]); std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog << std::endl; int fd;
int check_ret; fd = socket(PF_INET,SOCK_DGRAM , );
assert(fd >= ); struct sockaddr_in address;
bzero(&address,sizeof(address)); //转换成网络地址
address.sin_port = htons(port);
address.sin_family = AF_INET;
//地址转换
inet_pton(AF_INET, ip, &address.sin_addr); //绑定ip和端口
check_ret = bind(fd,(struct sockaddr*)&address,sizeof(address));
assert(check_ret >= ); while(){ char buffer[BUFFER_SIZE];
struct sockaddr_in addressClient;
socklen_t clientLen = sizeof(addressClient);
memset(buffer, '\0', BUFFER_SIZE);
//获取信息
if(recvfrom(fd, buffer, BUFFER_SIZE-,,(struct sockaddr*)&addressClient, &clientLen) == -)
{
perror("Receive Data Failed:");
exit();
}
printf("buffer=%s\n", buffer);
}
close(fd);
}
UDP CLIENT:
//
// main.cpp
// linux_socket_api_client
//
// Created by bikang on 16/11/2.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#include <iostream> #include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h> void tserver(int argc, const char * argv[]); int main(int argc, const char * argv[]) {
tserver(argc,argv);
return ;
}
void tserver(int argc, const char * argv[]){
std::cout << "t server" << std::endl;
if(argc < ){
exit(-);
} const char* ip = argv[];
int port = atoi(argv[]);
int backlog = atoi(argv[]); std::cout << "ip=" << ip << " port="<<port << " backlog=" << backlog << std::endl; int fd;
int check_ret; fd = socket(PF_INET,SOCK_DGRAM , );
assert(fd >= ); struct sockaddr_in address;
bzero(&address,sizeof(address)); //转换成网络地址
address.sin_port = htons(port);
address.sin_family = AF_INET;
//地址转换
inet_pton(AF_INET, ip, &address.sin_addr);
//发送数据
const char* normal_data = "my boy!";
if(sendto(fd, normal_data, strlen(normal_data),,(struct sockaddr*)&address,sizeof(address)) < )
{
perror("Send File Name Failed:");
exit();
}
close(fd);
}
另附:
linux网络编程常用头文件:
sys/types.h:数据类型定义
sys/socket.h:提供socket函数及数据结构
netinet/in.h:定义数据结构sockaddr_in
arpa/inet.h:提供IP地址转换函数
netdb.h:提供设置及获取域名的函数
sys/ioctl.h:提供对I/O控制的函数
sys/poll.h:提供socket等待测试机制的函数
其他在网络程序中常见的头文件
unistd.h:提供通用的文件、目录、程序及进程操作的函数
errno.h:提供错误号errno的定义,用于错误处理
fcntl.h:提供对文件控制的函数
time.h:提供有关时间的函数
crypt.h:提供使用DES加密算法的加密函数
pwd.h:提供对/etc/passwd文件访问的函数
shadow.h:提供对/etc/shadow文件访问的函数
pthread.h:提供多线程操作的函数
signal.h:提供对信号操作的函数
sys/wait.h、sys/ipc.h、sys/shm.h:提供进程等待、进程间通讯(IPC)及共享内存的函数
在编写网络程序时,可以直接使用下面这段头文件代码
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <fcntl.h>
涉及到用户权限及密码验证问题时加入如下语句:
#include <shadow.h>
#include <crypt.h>
#include <pwd.h>
需要注意的是,应该在编译时链接加密算法库,即增加编译选项:
-lcrypt
涉及到文件及时间操作加入如下语句:
#include <sys/time.h>
#include <utime.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/file.h>
涉及到多进程操作时加入如下语句:
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
涉及到多线程操作时加入如下语句:
#include <pthread.h>
#include <sys/poll.h>
需要注意的是,应该在编译时链接线程库,即增加编译选项:-lthread
[转][linux]简单的linux下的tcp/udp的更多相关文章
- 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?
什么是IP 协议? 协议就是为了实现网络通信而创建的一系列规范. 通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...
- 一篇文章带你了解服务器操作系统——Linux简单入门
一篇文章带你了解服务器操作系统--Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等 ...
- [JSBSim]基于winsocket2的TCP\UDP使用例子
TCP部分: 参考:http://blog.csdn.net/sbfksmq/article/details/50808863 另附:linux下的tcp/udp参考:https://www.cnbl ...
- TCP/UDP对比总结
目录 1 TCP-UDP对比 2 UDP介绍 3 TCP介绍 3.1 可靠传输的原理和实现 3.1.1 可靠传输原理 3.1.2 可靠传输实现 3.2 TCP面向连接管理 3.2.1 建立连接 3.2 ...
- nginx1.9+新增tcp/udp代理stream
[root@rhel nginx-]# ./configure --help --help print this message --prefix=PATH set installation pref ...
- Nginx1.14.2新增tcp/udp代理stream
[root@rhel nginx-1.12.1]# ./configure --help --help print this message --prefix=PATH set installatio ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- linux下的tcp连接超时
最近需要写一个linux下的通信程序, 通信模块用的是Qt的QTcpSocket. 最后程序需要增加一个断网检测, 在windows下调试没问题, 拔网线, 断网口都能马上检测到, 但到了部署到lin ...
随机推荐
- EditPlus配置Java
--Java Compile-- 命令:D:\Program Files\Java\jdk1.7.0_79\bin\javac.exe 参数:$(FileName) 初始目录:$(FileDir) 动 ...
- thinkphp 检测验证码
/** * 检测验证码 * @param integer $id 验证码ID * @return boolean 检测结果 */function check_verify($code, $id = 1 ...
- oci7编译报’olog’等未定义的引用问题
前一天在测试一个数据导出的时候,发现oci7编译的时候报了一大堆类似"’oparse’未定义的引用问题",这通常是因为找不到实现库的原因,但是oci相关的库又都是存在的,用oci7 ...
- Overture 5入门之如何设置延音线
延音线作为五线谱标记符合之一,是大家使用Overture时需要常用的一个基本标记符号.延音线是一条向上或向下弯曲的弧线,它的作用是将两个或两个以上的具有相同高音的音符来进行相连. 延音线作为再编曲演唱 ...
- 【python027--集合】
一.集合会剔除字典内重复的数字 >>> num = {1,2,3,3,4,5,5,6}>>> num{1, 2, 3, 4, 5, 6}>>> t ...
- django基础 -- 3. urls.py view.py 参数 别名 重定向 常用方法 静态文件
一.基本格式 from django.conf.urls import url from . import views #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数 ...
- noip模拟【ping】
70:很容易想到的是枚举每一个可能的答案来判断是否可行,取最优即可,贪心选择. 100:满足题目条件的这个距离是满足单调性的.如果x不行,那么大于x的距离都不行,二分答案. 学会运用二分,by ws_ ...
- hdu5628 Clarke and math
题目地址 题目链接 题意 求 \[ g(i)=\sum_{i1|i}\sum_{i_2|i_1}\sum_{i_3|i_2}...\sum_{i_k|i_{k-1}}f(i_k)\space mod\ ...
- Shiro学习笔记 三(认证授权)
第一种首先基于角色的权限控制 1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类 还是首先看一下目录结构 主要用到文件 首先贴一下工具类的方法 pa ...
- 解决: docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
直接获取 rpm文件 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.1 ...