The Internet (IPv4) socket address structure: sockaddr_in.

本文解析了socket编程中用于IPv4的地址结构sockaddr_in,并介绍了与之相关的socket函数,包括从进程到内核的bind、connect、sendto和sendmsg函数,以及从内核返回到进程的accept、recvfrom、recvmsg、getpeername和getsockname函数。
 
struct in_addr {
in_addr_t s_addr; /* 32-bit IPv4 address */
/* network byte ordered */
};

struct sockaddr_in {
uint8_t sin_len; /* length of structure (16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP or UDP port number */
/* network byte ordered */
struct in_addr sin_addr; /* 32-bit IPv4 address */
/* network byte ordered */
char sin_zero[8]; /* unused */
};

==有四个socket函数将socket地址数据结构从进程传递至内核,它们分别是bind,connect,sendto和sendmsg函数。
而有五个socket函数将socket地址数据结构从内核传递至进程,分别是accept,recvfrom,recvmsg,getpeername和getsockname。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 /* Function declarations */ int create_server_socket(); void bind_server_socket(int server_fd); void start_listening(int server_fd); int accept_client_connection(int server_fd); void handle_client_communication(int client_socket); /* Create and return a TCP server socket */ int create_server_socket() { int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == 0) { perror("Socket creation failed"); exit(EXIT_FAILURE); } return server_fd; } /* Bind socket to specified port */ void bind_server_socket(int server_fd) { struct sockaddr_in address; address.sin_family = AF_INET; /* IPv4 */ address.sin_addr.s_addr = INADDR_ANY; /* Listen on all interfaces */ address.sin_port = htons(PORT); /* Port number */ if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("Bind failed"); exit(EXIT_FAILURE); } } /* Start listening for incoming connections */ void start_listening(int server_fd) { if (listen(server_fd, 3) < 0) { perror("Listen failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", PORT); } /* Accept incoming client connection */ int accept_client_connection(int server_fd) { struct sockaddr_in address; int addrlen = sizeof(address); int client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen); if (client_socket < 0) { perror("Accept failed"); exit(EXIT_FAILURE); } printf("Connection accepted from %s:%d\n", inet_ntoa(address.sin_addr), ntohs(address.sin_port)); return client_socket; } /* Handle communication with connected client */ void handle_client_communication(int client_socket) { char buffer[BUFFER_SIZE] = {0}; while (1) { /* Receive data from client */ int valread = read(client_socket, buffer, BUFFER_SIZE); if (valread <= 0) { printf("Client disconnected\n"); break; } printf("Client: %s", buffer); /* Send response to client */ printf("Server: "); if (fgets(buffer, BUFFER_SIZE, stdin) == NULL) { break; } if (send(client_socket, buffer, strlen(buffer), 0) < 0) { perror("Send failed"); break; } } } int main() { /* Server setup */ int server_fd = create_server_socket(); bind_server_socket(server_fd); start_listening(server_fd); /* Client handling */ int client_socket = accept_client_connection(server_fd); handle_client_communication(client_socket); /* Cleanup */ close(client_socket); close(server_fd); return 0; } 分成src文件和include文件
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值