使用的库函数
#include<sys/types.h>
#include <sys/socket.h>
1.socket函数
创建一个套接字
int socket(int domain, int type, int protocol);
domain指定要创建的套接字的协议族;
type指定套接字类型;
protocol指定使用哪种协议;
domain参数取值:
AF_UNIX UNIX域协议族,本机进程间通信时使用
AF_INET Internet协议族
AF_ISO ISO协议族
type参数取值:
SOCK_STREAM 流套接字,面向连接的和可靠的通信协议;
SOCK_DGRAM 数据套接字,面向非连接和不可靠的通信协议
SOCK_RAM 原始套接字,只对Internet协议有效,可以用来直接访问IP协议
参数protocol一般设为0,表示使用默认协议,如
Internet协议族的套接字使用TCP协议;
数据套接字使用UDP协议
2.connect函数
用于与服务器建立一个连接。
int connect(sockfd, struct sockaddr *servaddr, int addrlen);
sockfd是函数socket返回的套接字描述符;
servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号;
addrlen指定这个套接字地址的长度;
3.bind函数
将本地地址与套接字绑定在一起
int bin(int sockfd, struct sockaddr *myaddr, int addrlen);
sockfd是函数socket返回的套接字描述符;
myaddr是本机地址;
addrlen指定这个套接字地址的长度;
4.listen函数
将套接字转为套接字
int listen(int sockfd, int backlog);
sockfd是函数socket返回的套接字描述符;
backlog设置请求队列的最大长度;
5.accept函数
int accept(int sockfd, struct sockaddr *addr, int *addrlen);
sockfd是函数socket返回的套接字描述符;
addr是指向一个Internet套接字地址结构的指针;
addrlen指定这个套接字地址的长度;
6.close函数
关闭一个套接字
int close(sockfd);
sockfd是函数socket返回的套接字描述符;
7.read和write函数
int read(int fd, char *buf, int len);
int write(int fd, char *buf, int len);
fd指定读写操作的套接字描述符;
buf指定接收或发送数据缓冲区;
len接受或发送数据长度;
举例:
server服务器
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main()
{
int listenfd, connfd;
socklen_t len;
struct sockaddr_in servaddr, cliaddr;
char buff[512];
time_t ticks;
listenfd=socket(AF_INET, SOCK_STREAM,0);
if(listenfd<0)
{
printf("Socket created failed.\n");
return -1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0)
{
printf("bind failed.\n");
return -1;
}
printf("listening....\n");
listen(listenfd, 5);
while(1)
{
len=sizeof(cliaddr);
connfd=accept(listenfd,(struct sockaddr *)&cliaddr, &len);
printf("connect from %s, port %d \n",inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));
ticks=time(NULL);
sprintf(buff,"% .24s \r \n",ctime(&ticks));
write(connfd,buff,strlen(buff));
close(connfd);
}
}
client客户端
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
int sockfd,n;
char recvbuff[256];
struct sockaddr_in servaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("Socket created failed.\n");
return -1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
printf("connecting...\n");
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
{
printf("Connect server failed.\n");
return -1;
}
while((n=read(sockfd,recvbuff,256))>0)
{
recvbuff[n]=0;
fputs(recvbuff,stdout);
}
if(n<0)
{
printf("Read failed!\n");
return -2;
}
return 0;
}