入门的API函数
这些函数的参数都有好多选项,提供了很多的功能,一下子也记不住,记住常用的。
这篇博客也没有说过多的细节,入门嘛,先上手再说。
/
socket(int , int , int) :获得一个套接字描述符
第一个参数:协议族。 常用的就是AF_INET(ipv4)或者AF_INET6(ipv6)
第二个参数:套接字类型。常用的就是SOCK_STREAM(字节流套接字,TCP)或者SOCK_DGRAM(数据包套接字,UDP)
第三个参数:协议族中的哪一个协议。常用的就是0(系统自动选择默认协议)
返回值:返回一个打开的套接字描述符,类似于open一个文件的返回值。也是一个非负整数。
这个函数在服务器端和客户端都要使用。
/
bind(int , struct sockaddr * , socklen_t):将指定的套接字和指定的本地的网络地址绑定在一起
第一个参数:指定的套接字描述符。
第二个参数:指定的网络地址结构体指针。
第三个参数:第二个参数指向的结构体所占内存的字节数。
执行成功就将指定的套接字描述符和指定的本地的网络地址绑定在了一起。
这个函数在服务器端和客户端都不一定非要使用,但是在服务器端不使用很罕见。
/
listen(int , int):使指定的套接字监听网络
第一个参数:指定的套接字描述符。
第二个参数:多个客户端与服务器端相连的时候,这个值代表处于等待的队列的长度。
执行成功后,指定套接字就变为监听状态(LISTEN)。
这个函数只在服务器端使用。
/
connect(int , struct sockaddr * , socklen_t ):建立与服务器端的连接
第一个参数:建立连接的套接字描述符。
第二个参数:存储服务器端的网络地址结构体指针。
第三个参数:第二个参数指向的结构体所占内存的字节数。
执行成功,就与指定的服务器端建立连接。
这个函数只在客户端使用。
/
accept(int , struct sockaddr * , socklen_t *):服务器端用来监听客户端的连接请求,用此函数来接受连接请求
第一个参数:作为listen()函数的第一个参数的套接字描述符。
第二个参数:执行成功后存储请求连接的客户端的网络地址结构体指针。如果对客户端的信息不感兴趣,可以将此参数置为NULL。
第三个参数:执行成功后存储第二参数执行的结构体所占内存的字节数。如果对这个信息不感兴趣,可以将此参数置为NULL。
执行成功后返回一个套接字描述符,用来标识与客户端的连接。
如果没有监听到客户端的连接请求,此函数阻塞。
/
read(int , void * , int);从指定的套接字描述符中读取数据。
write(int , void * , int):向指定的套接字描述符中写入数据。
上面的这两个函数就和文件I/O的使用方法是一样的。
/
send(int , void *, int , int):一般将最后一个参数置为0,功能就和write()一样了。
recv(int , void * , int , int):一般将最后一个参数置为0,功能就和read()一样了。
send()和recv()函数的第四个参数提供了很多功能。可以去查查API。
/
close(int):关闭套接字描述符
第一个参数:指定关闭的套接字描述符。
shutdown(int , int):关闭套接字描述符
第一个参数:指定关闭的套接字描述符。
第二个参数:更多的关闭选项。
下面写一个简单的例子:
服务器端代码:
#include<stdio.h>
#include <sys/socket.h>
#include <resolv.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
int port;
char ip_addr[15];
int client_port;
int sockfd;
struct sockaddr_in my;
printf("input address:");
fgets(ip_addr,15,stdin);
printf("input port:");
scanf("%d",&port);
sockfd = socket(AF_INET,SOCK_STREAM,0);
memset(&my,0,sizeof(struct sockaddr_in));
my.sin_family = AF_INET;
my.sin_port = htons(port);
my.sin_addr.s_addr = inet_addr(ip_addr);
bind(sockfd,(struct sockaddr *)&my,sizeof(struct sockaddr));
listen(sockfd,5);
printf("wait connect......\n");
client_port = accept(sockfd,NULL,NULL);
printf("send successfully!\n");
write(client_port,"hello!",strlen("hello!"));
close(sockfd);
close(client_port);
return 0;
}
客户端代码:
#include<stdio.h>
#include <sys/socket.h>
#include <resolv.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
int sockfd;
char buffer[8];
struct sockaddr_in my;
int port;
char ip_addr[15];
printf("input server address:");
fgets(ip_addr,15,stdin);
printf("input server port:");
scanf("%d",&port);
sockfd = socket(AF_INET,SOCK_STREAM,0);
memset(&my,0,sizeof(struct sockaddr_in));
my.sin_family = AF_INET;
my.sin_port = htons(port);
my.sin_addr.s_addr = inet_addr(ip_addr);
connect(sockfd,(struct sockaddr *)&my,sizeof(my));
recv(sockfd,buffer,8,0);
close(sockfd);
printf("%s\n",buffer);
return 0;
}
能运行