步骤:
1. 创建套件字
fd1 = socket(AF_INET, SOCK_STREAM, 0);
参数1:通信域
AF_UNIX/AF_LOCAL: 本机通信
AF_INET :跨机器通信--用的协议族ipv4
参数2:传输什么类型是数据
SOCK_STREAM: 传输是字节流---tcp
SOCK_DGRAM :传输的是数据报-- udp
SOCK_RAW : 传输的是内部协议--icmp
2. 绑定 : 端口号和ip地址(当前主机)进行绑定,让别人链接
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数1:当前的创建的socket
参数2:地址和端口的信息和 self.sin_family = AF_INET;
参数3:地址和信息的长度
3. 设置监听 :
int listen(int sockfd, int backlog);
参数2:最大的客户端的个数, 5-10
4. 等待客户端的连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数1: 服务端的创建的socket对应的fd
参数2,3表示客户端的信息,当然也可以不关心对方是谁,就可以填NULL, NULL
返回值:返回一个新的文件描述符,和客户端进行数据通信的
服务端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/in.h>
#define SRV_PORT 9999
int main(int argc, char *argv[])
{
int srv_fd;
int ret;
char buf[128];
srv_fd = socket(AF_INET, SOCK_STREAM, 0);
if(srv_fd < 0)
{
perror("socket");
exit(1);
}
struct sockaddr_in self;
self.sin_family = AF_INET;
self.sin_port = htons(SRV_PORT);
self.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(srv_fd, (const struct sockaddr *)&self, sizeof(self));
if(ret < 0)
{
perror("bind");
exit(1);
}
listen(srv_fd, 6);
int new_fd;
printf("--------^_^ I'am waing.......\n");
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
new_fd = accept(srv_fd, (struct sockaddr *)&client_addr, &len);
if(new_fd < 0)
{
perror("accept");
exit(1);
}
printf("we got a new client\n");
printf("client ip : %s, port : %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
while(1)
{
ret = read(new_fd, buf, 128);
if(ret < 0)
{
perror("read");
exit(1);
}
if(ret == 0)
{
printf("client disconnect\n");
break;
}
buf[ret] = '\0';
printf("from client : %s\n", buf);
}
close(srv_fd);
close(new_fd);
return 0;
}
客户端
#include <stdio.h>
#include <string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/in.h>
#define SRV_PORT 9999
#define SRV_IP "192.168.7.5"
int main(int argc, char *argv[])
{
int ret;
int count = 5;
char *content = "hello server, come on baby";
if(argc < 2)
{
printf("usage : ./client serverip\n");
exit(1);
}
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd < 0)
{
perror("socket");
exit(1);
}
struct sockaddr_in peer;
peer.sin_family = AF_INET;
peer.sin_port = htons(SRV_PORT);
inet_aton(argv[1], &peer.sin_addr);
ret = connect(fd, (struct sockaddr *)&peer, sizeof(peer));
if(ret < 0)
{
perror("connect");
exit(1);
}
while(count--)
{
ret = write(fd, content, strlen(content));
if(ret < 0)
{
perror("write");
exit(1);
}
sleep(1);
}
close(fd);
return 0;
}