ابزار کاربر

ابزار سایت


socket-programming:send

تفاوت‌ها

تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده می‌کنید.

پیوند به صفحه‌ی تفاوت‌ها

socket-programming:send [2024/06/18 00:29] – ایجاد شد pejmansocket-programming:send [2024/06/18 01:01] (فعلی) – حذف شد pejman
خط 1: خط 1:
-====== تابع ()send ====== 
- 
-از این تابع برای نوشتن در یک سوکت از نوع stream استفاده می شود. 
- 
-<code C> 
-#include <sys/types.h> 
-#include <sys/socket.h> 
- 
-ssize_t send(int sockfd, const void *buf, size_t len, int flags); 
-</code> 
- 
-مقدار بازگشتی این تابع تعداد بایتی است که توانسته ارسال کند. اگر این مقدار کمتر از len باشد ما موظیم مابقی buf را مجدد از طریق [[send]] ارسال کنیم. 
- 
-مثال ارسال Hello world برروی بستر SOCK_STREAM توسط [[send]] : 
- 
-<code C> 
-#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 PORT "3450" 
-#define BACKLOG 120 
- 
-int main() 
-{ 
-    char *msg = "Hello World!"; 
-    void *addr; 
-    char *ipver; 
-    char ipstr[INET6_ADDRSTRLEN]; 
- 
-    int status, sockfd, clientfd, sockopt, len; 
-    struct addrinfo hints, *res, *rp; 
-    struct sockaddr_storage clientaddr; 
-    struct sockaddr *sa; 
-    socklen_t addrlen; 
- 
-    memset(&hints, 0, sizeof(hints)); 
-    hints.ai_flags = AI_PASSIVE; 
-    hints.ai_family = AF_INET6; 
-    hints.ai_socktype = SOCK_STREAM; 
-    hints.ai_protocol = 0; 
- 
-    status = getaddrinfo(NULL, PORT, &hints, &res); 
-    if (status != 0) { 
-        fprintf(stderr, "getaddrinfo() error: %s\n",  
-                gai_strerror(status)); 
-        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) { 
-            perror("socket() error"); 
-            continue; 
-        } 
- 
-        sockopt = 1; 
-        status = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,  
-                            &sockopt, sizeof(sockopt)); 
-        if (status == -1) { 
-            perror("setsockopt() error"); 
-            exit(EXIT_FAILURE); 
-        } 
- 
-        sockopt = 0; 
-        status = setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, 
-                            &sockopt, sizeof(sockopt)); 
-        if (status == -1) { 
-            perror("setsockopt() error"); 
-            exit(EXIT_FAILURE); 
-        } 
- 
-        status = bind(sockfd, rp->ai_addr, rp->ai_addrlen); 
-        if (status == -1) { 
-            perror("bind() error"); 
-            continue; 
-        } 
- 
-        break; 
-    } 
-    freeaddrinfo(res); 
- 
-    if (rp == NULL) { 
-        fprintf(stderr, "Server: Failed to bind()\n"); 
-        exit(EXIT_FAILURE); 
-    } 
- 
-    status = listen(sockfd, BACKLOG); 
-    if (status == -1) { 
-        perror("listen() error"); 
-        exit(EXIT_FAILURE); 
-    } 
- 
-    fprintf(stdout, "Server: waiting for connections...\n"); 
- 
-    addrlen = sizeof(clientaddr); 
-    clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &addrlen); 
- 
-    sa = (struct sockaddr*)&clientaddr; 
-    if (sa->sa_family == AF_INET) { 
-        ipver = "IPv4"; 
-        addr = &(((struct sockaddr_in *)sa)->sin_addr); 
-    } else { 
-        ipver = "IPv6"; 
-        addr = &(((struct sockaddr_in6 *)sa)->sin6_addr); 
-    } 
-    inet_ntop(sa->sa_family, addr, ipstr, sizeof(ipstr)); 
-    fprintf(stdout, "Server: Got an %s connection from %s\n", ipver, ipstr); 
-     
-    fprintf(stdout, "Server: Sending data ...\n"); 
-    len = strlen(msg); 
-    status = send(clientfd, msg, len, 0); 
-    if (status == -1) 
-        perror("send() error "); 
-    else 
-        fprintf(stdout, "Server: byte sent = %d\n", status); 
- 
-    close(clientfd); 
-    close(sockfd); 
-    return 0; 
-} 
-</code> 
- 
-کلاینت 
- 
-  $ telnet 127.0.0.1 3450 
-  Trying 127.0.0.1... 
-  Connected to 127.0.0.1. 
-  Escape character is '^]'. 
-  Hello World!Connection closed by foreign host. 
- 
-خروجی سرور 
- 
-  Server: waiting for connections... 
-  Server: Got an IPv6 connection from ::ffff:127.0.0.1 
-  Server: Sending data ... 
-  Server: byte sent = 12 
  
socket-programming/send.1718657978.txt.gz · آخرین ویرایش: 2024/06/18 00:29 توسط pejman

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