ابزار کاربر

ابزار سایت


socket-programming:socket

این یک نگارش قدیمی از این مطلب است!


تابع ()socket

از socket برای دریافت یک file descriptor جهت ارتباط با شبکه یا پروسس های دیگر، استفاده میشود.

// man 2 socket
#include <sys/types.h>
#include <sys/socket.h>
 
sockfd = socket(int socket_family, int socket_type, int protocol);

بهتر است تمام ورودی های socket از طریق getaddrinfo آماده شود. domain همان rp→ai_family و type همان rp→ai_socktype و protocol همان rp→ai_protocol است. باید تک تک استراکچر های linked-listی که getaddrinfo برگردانده بررسی شود تا بالاخره بتوانیم هم از طریق socket یک file descriptor بگیریم هم از طریق bind به port متصل شویم.

مثال برای گرفتن file descriptor توسط socket با کنترل تک تک استراکچرهای linked-list آماده شده توسط getaddrinfo :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
 
#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)
 
#define PORT "3440"
 
int main()
{
	int sockfd, errcode;
	struct addrinfo hints, *res, *rp;
	char *ipver, ipstr[INET6_ADDRSTRLEN];
	void *addr;
 
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_flags = AI_PASSIVE;    /* For wildcard IP address */
 
	errcode = getaddrinfo(NULL, PORT, &hints, &res);
	if (errcode != 0) {
		fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(errcode));
		exit(EXIT_FAILURE);
	}
 
	for (rp = res; rp != NULL; rp = rp->ai_next) {
		sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
		if (sockfd == -1) {
			handle_error("socket() error");
			continue;
		}
		if (rp->ai_family == AF_INET) {
			ipver = "IPv4";
			addr = &(((struct sockaddr_in*)(rp->ai_addr))->sin_addr);
		} else {
			ipver = "IPv6";
			addr = &(((struct sockaddr_in6*)(rp->ai_addr))->sin6_addr);
		}
		inet_ntop(rp->ai_family, addr, ipstr, sizeof ipstr);
		fprintf(stdout, "I got a %s socket for %s = %d\n", ipver, ipstr, sockfd);
		close(sockfd);
	}
 
	freeaddrinfo(res);
 
	return 0;
}

خروجی

I got a IPv4 socket for 0.0.0.0 = 3
I got a IPv6 socket for :: = 3
socket-programming/socket.1718657826.txt.gz · آخرین ویرایش: 2024/06/18 00:27 توسط pejman

به جز مواردی که ذکر می‌شود، مابقی محتویات ویکی تحت مجوز زیر می‌باشند: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki