ابزار کاربر

ابزار سایت


c-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
c-socket-programming/socket.1718659754.txt.gz · آخرین ویرایش: 2024/06/18 00:59 توسط pejman

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