文章目录
socket编程
1.socket函数
int SOCKET socket(int af,int type,int protocol)
af:位址资料族系 type:通讯方式 protocal:传输协定编号
返回值:-1表示建立socket发送变化,非负整数则表示成功,称为socket描述符
2.bind函数
int bind(SOCKET s,const struct sockaddr* name,int namelen)
s:指定好通讯协定的socket name:本地端位址 namelen:name长度
2.1 Sockaddr_in格式
struct socketaddr_in{
short sin_family;
u_short sin_port;
shruct in_addr sin_addr;
char sin_zero[8];
};
sin_family:位址资料族系,同样设定为AF_INET(ipv4)
sin_port:主机开放的通讯端口号,用htons()写入
sin_addr:主机IP地址,in_addr资料格式
sin_zero[8]:目前没有用,保留以后使用
2.2 in_addr格式
typedef struct in_addr{
union{
struct{u_char s_b1,s_b2,s_b3,s_b4;}S_un_b;
struct{u_short s_w1,s_w2;}S_un_w;
u_long S_addr;
}S_un;
}in_addr;
使用union的联合体,实际上大小是32bit的长整形,只要写入u_long S_addr这个变量,头文件中宏定义#define s_addr S_un.s_addr,写入IP时使用inet_addr(“IP位址字串”)转换成unsigned long类型
3. listen函数
listen是使socket进入等待连接状态,等待客户端连上线;
如果有client想要连过来,此时可以呼叫connect()来跟server连线,server接受后会建立新的socket和client通讯,listen socket则继续存在等待其他client,直到关闭为止
int listen(SOCKET s,int backlog);
s:设定好bind(),并且尚未连线的socket
backlog:等待server接受连线前,同时最大连接数
返回值:-1表错误,否则为0
4.accept函数
SOCKET accept(SOCKET s,struct sockaddr* addr,int* addrlen);
s:一个设定为listen状态的socket
addr:client 端位址咨询,由函数自动生成填入
addrlen:sddr长度,由函数自动产生
返回值:-1表示错误,否则传回另一个包含client端咨询的新socket descriptor,作为传送资料用
传进accept()的listen socket 本身并没有办法作资料的传输,所有必须透过accept()产生一个包含通讯协定、server\client咨询的新socket,利用他进行资料的传输
5.connect函数
int connect(SOCKET s,const struct sockaddr* name,int namelen);
返回值:-1表示错误,否则返回0
6.recv函数
int recv(SOCKET s,char* buf,int len,int flags);
s:一个建立连接成功的socket
buf:呼叫recv,用来储存收到的资料
len:buf的长度
flags:选择工作模式,一般为0
返回值:-1表示错误,否则回传接收到资料的长度
7.closesocket(),shutdown()函数 中断连接
在accept()或connect()成功后建立的通讯用socket,必须用closesocket()或shutdown()来结束连接