目录
函数介绍
代码实现
函数介绍
socket函数与通信域:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
-domain:指定通信域(通信地址族);
AF_INET:使用IPV4互联网协议;
AF_INET6:使用IPV6互联网协议;
-type:指定套接字类型;
TCP唯一对应流式套接字,所以选择SOCK_STREAM(UDP使用数据报套接字:SOCK_DGRAM)
-protocol:指定协议;
流式套接字唯一对应TCP,所以无需指定协议,设置为0即可;
bind函数与通信结构体:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-sockfd:socket函数生成的套接字;
-addr:通信结构体;
-addrlen:通信结构体的长度;
domain 通信地址族与通信结构体:
listen 函数与accept函数:
/*监听套接字*/
int listen(int sockfd, int backlog);
/*处理客户端发起的连接,生成新的套接字*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
-sockfd:函数socket生成的套接字;
-addr:客户端的地址信息;
-addrlen:地址族结构体的长度;
代码实现
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
#define BACKLOG 5
int main(int argc, char *argv[])
{
int fd, newfd, ret;
char buf[BUFSIZ] = {}; //BUFSIZ 8142字节
struct sockaddr_in addr;
if (argc < 3) {
fprintf(stderr, "%s<addr><port>\n", argv[0]);
exit(0);
}
/*创建套接字 */
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
if (inet_aton(argv[1], &addr.sin_addr) == 0) {
fprintf(stderr, "Invalid address\n");
exit(EXIT_FAILURE);
}
/*绑定通信结构体*/
if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1){
perror("bind");
exit(0);
}
/*设置套接字为监听模式*/
if (listen(fd, BACKLOG) == -1) {
perror("listen");
exit(0);
}
/*接受客户端的连接请求,生成新的用于和客户端通信的套接字*/
newfd = accept(fd, NULL, NULL);
if (newfd < 0) {
perror("newfd");
exit(0);
}
while(1) {
memset(buf, 0, BUFSIZ);
ret = read(newfd, buf, BUFSIZ);
if(ret < 0) {
perror("read");
exit(0);
}else if(ret == 0)
break;
else
printf("buf = %s\n", buf);
}
close(newfd);
close(fd);
return 0;
}
客户端:
#include <stdio.h>
#include<sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define BACKLOG 5
#define STR "hello world"
int main (int argc, char *argv[])
{
int fd;
struct sockaddr_in addr;
char buf[BUFSIZ] = {};
if (argc < 3) {
fprintf(stderr, "%s<addr><port>\n", argv[0]);
exit(0);
}
/*创建套接字 */
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
if (inet_aton(argv[1], &addr.sin_addr) == 0) {
fprintf(stderr, "Invalid address\n");
exit(EXIT_FAILURE);
}
/*向服务端发起连接请求*/
if(connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("connect");
exit(0);
}
while(1) {
printf("input->");
fgets(buf, BUFSIZ, stdin);
write(fd, buf, strlen(buf));
}
close(fd);
return 0;
}