用到的api
socket();
bind();
listen();
accept();
read();(见文件编程)
write();(见文件编程)
头文件
#include <sys/types.h>
#include <sys/socket.h>
1,socket():用于创建一个socket描述符
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int socket(int domain, int type, int protocol);
domain:指明所使用的协议族,通常为AF_INET,表示为互联网协议族
type:指定socket的类型,tcp使用SOCK_STREAM。
protocol:一般为0,选择type默认类型
2,bind();
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
sockfd:网络描述符
*addr:是指向本机IP地址和端口号的信息的指针
addrlen:结构体大小
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
int inet_aton(const char *cp, struct in_addr *inp);把字符串的形式转化为网络能识别的格式
char *inet_ntoa(struct in_addr in);把网络格式的ip地址转化为字符串形式
3, int listen(int sockfd, int backlog);
sockfd:网络描述符,
backlog:最大连接数
4,accept()
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
addr:客户端的详细信息。
addrlen:addr结构体的大小
5,connect()
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
*addr:初始化要连接的网络端口后和IP地址,与bind()相似。
addrlen:addr的大小
服务器
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
// int socket(int domain, int type, int protocol);
int main()
{
//socket
int s_fd = socket(AF_INET, SOCK_STREAM,0);
if(s_fd == -1){
perror("socket");
exit(-1);
}
struct sockaddr_in s_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(8888);
inet_aton("192.168.31.73",&s_addr.sin_addr);
//bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//listen
listen(s_fd,10);
//accept
printf("wait connecting\n");
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen = sizeof(struct sockaddr_in);
int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd == -1){
perror("accept");
exit(-1);
}
printf("connect,%s\n",inet_ntoa(c_addr.sin_addr));
//read
char Readbuf[128];
int nread = read(c_fd, Readbuf,128);
if(nread == -1){
exit(-1);
perror("read");
}
else{
printf("nread:%d,context:%s\n",nread,Readbuf);
}
//write
char *Writebuf = "liuxinishandsome";
int nwrite = write(c_fd, Writebuf,strlen(Writebuf));
return 0;
}
客服端
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
// int socket(int domain, int type, int protocol);
int main()
{
//socket
int c_fd = socket(AF_INET, SOCK_STREAM,0);
if(c_fd == -1){
perror("socket");
exit(-1);
}
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(8888);
inet_aton("192.168.31.73",&c_addr.sin_addr);
//connect
// int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
int clent = sizeof(struct sockaddr_in);
if(connect(c_fd,(struct sockaddr *)&c_addr,clent)){
perror("connect");
exit(-1);
}
//write send
char *Writebuf = "get your connection";
int nwrite = write(c_fd, Writebuf,strlen(Writebuf));
//read
char Readbuf[128];
int nread = read(c_fd, Readbuf,128);
if(nread == -1){
exit(-1);
perror("read");
}
else{
printf("nread:%d,context:%s\n",nread,Readbuf);
}
return 0;
}
例子
师上官可编程