【网络编程】TCP有关函数
来源:互联网 发布:孙悟空法力 知乎 编辑:程序博客网 时间:2024/06/05 06:12
1、socket函数
原型:int socket(int family, int type, int protocol);
作用:建立一下新的socket套接字
参数:family:表示使用的是何种地址类型;AF_INET,IPV4;AF_INET6,IPV6;
类型:SOCK_STREAM 用于TCP
SOCK_DGRAM 用于UDP
protocol:传输协议编号,设为0即可
返回值:成功返回socket套接字描述符;失败返回-1。
头文件:#include<sys/types.h>
#include<sys/socket.h>
2、bind函数
原型:int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
作用:绑定IP地址
参数:sockfd:套接字描述符
myaddr:是一个指向sockaddr结构的地址
struct sockaddr_in
{
short int sin_family; /* Internet地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填0 */
};
addrlen:为参数sockaddr的长度
返回值:成功返回0,失败返回-1,错误的原因在errno中
头文件:#include<sys/types.h>
#include<sys/socket.h>
在bind之前要先对结构体进行设置:
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
首先将整个结构体清零,然后设置地址类型为AF_INET,网络地址为INADDR_ANY,这个宏表示本地的任意IP地址,因为服务器可能有多个网卡,每个网卡也可能绑定多个IP地址,这样设置可以在所有的IP地址上监听,直到不某个客户端建立了连接时才确定下来到底用哪个IP地址,端口号为SERV_PORT,我们定义为8000
3、listen
原型:int listen(int sockfd,int backlog);
作用:监听网络,等待参数sockfd的socket连线
参数:sockfd:套接字描述符
backlog:同时能处理的最大连接要求
返回值:成功返回0,失败返回-1,错误原因在errno
头文件:#inlcude<sys/socket>
注意:listen并未真正开始接收连线,真正接受client端连线的是accept
4、accpet
原型:int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
作用:用于接受socket的连线
参数:sockfd:套接字描述符
cliaddr:连接成功之后,填充的是客户端的地址
addrlen:sockaddr的地址
返回值:成功返回新的套接字,失败返回-1
头文件:#include<sys/types.h>
#include<sys/socket.h>
5、connect
原型:int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
作用:建立socket套接字,通常客户端连接服务器
参数:sockfd:套接字描述符
addr:sockaddr的结构体
addrlen:sockaddr的长度
返回值:成功返回0,失败返回-1
头文件:#include<sys/types.h>
#include<sys/socket.h>
6、send
原型:int send(int sockfd,const void*msg,int len ,unsigned int falgs);
作用:经过socket传送数据,向对方发送数据
参数:sockfd:套接字描述符,在服务器那端接受的应该为accept返回的新的描述符
msg:欲连线的的数据内容
len:信息的长度
falgs:一般设为0
返回值:成功返回实际传送出去的字符数,失败返回-1,错误原因在errno中
头文件:#include<sys/types.h>
#include<sys/socket.h>
7、recv
原型:int recv(int sockfd,void*buf,int len,unsigned int flags);
作用:经过socket接受套接字
参数:sockfd:套接字描述符,在服务器那端接受的应该为accept返回的新的描述符
buf:接受数据的空间
len:接受字符的长度
flags:一般设置为0
返回值:成功返回接受的字符数,失败-1
头文件:#include<sys/types.h>
#include<sys/socket.h>
tcp服务器:
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define portnumber 3333int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size; int nbytes;char buffer[1024]; //1. socketif((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP{ fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); } //2.bindbzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0server_addr.sin_family=AF_INET; // Internetserver_addr.sin_addr.s_addr=htonl(INADDR_ANY); // (将本机器上的long数据转化为网络上的long数据)和任何主机通信 //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ipserver_addr.sin_port=htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号 // server_addr.sin_addr.s_addr=inet_addr("192.168.1.199");//;htonl(INADDR_ANY);/* 捆绑sockfd描述符到IP地址 */ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); } //3.listen if (listen(sockfd, 5)==-1) { printf("listen error\n"); } while(1) { sin_size=sizeof(struct sockaddr_in); printf("1\n"); //4.accept if(( new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) <0) {printf("accept error.\n"); } fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); //5.recv/sendif((nbytes=read(new_fd,buffer,1024))==-1) { fprintf(stderr,"Read Error:%s\n",strerror(errno)); exit(1); } buffer[nbytes]='\0';printf("Server received %s\n",buffer);/* 这个通讯已经结束 */ close(new_fd); /* 循环下一个 */ } /* 结束通讯 */ close(sockfd); exit(0); }
tcpclient.c
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define portnumber 3333int main(){ int sockfd; struct sockaddr_in serv_addr; int addlen=sizeof(struct sockaddr); char buf[512]="hello world"; //1.socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1) {printf("socket error"); } bzero(&serv_addr,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(portnumber); serv_addr.sin_addr.s_addr=inet_addr("192.168.1.199"); //2.connect if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) <0) {printf("connect error\n"); } //3.send if( send(sockfd, buf, strlen(buf), 0 ) <0) { printf("send error\n"); } //4.close close(sockfd);}
- 【网络编程】TCP有关函数
- TCP网络编程基本函数
- TCP API 网络编程函数
- TCP网络编程框架函数
- 基于TCP网络编程常用函数
- TCP/IP网络编程函数解析
- TCP/IP网络编程函数解析
- TCP/IP网络编程函数解析
- TCP/IP网络编程函数解析
- TCP/IP相关的网络编程函数
- TCP/IP网络编程_bind函数
- Linux网络编程:2. 初等网络函数介绍(TCP)
- Linux网络编程--2. 初等网络函数介绍(TCP)
- Linux网络编程--初等网络函数介绍(TCP)
- Linux网络编程--2. 初等网络函数介绍(TCP)
- (二)Linux网络编程--初等网络函数介绍(TCP)
- Linux网络编程--初等网络函数介绍(TCP)
- Linux网络编程--初等网络函数介绍(TCP)
- 电脑蓝屏0x0000007B
- FlyRefresh——让人眼前一亮的下拉刷新
- Android常用控件封装:统一样式、背景使用方式
- 堆和栈的区别
- PHP匿名函数
- 【网络编程】TCP有关函数
- redis 配置的说明
- 插入排序
- 配置机器:win10 + ubuntu16.04 + gtx1080
- HDOJ 4596 Yet another end of the world【数学】
- maven 目录结构
- JS干货--拷贝与继承
- Python 是否是下一个 PHP?为什么?
- 4-2 顺序表操作集 (20分)