ابزار کاربر

ابزار سایت


c-socket-programming:send

تابع ()send

از این تابع برای نوشتن در یک سوکت از نوع stream استفاده می شود.

#include <sys/types.h>
#include <sys/socket.h>
 
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

مقدار بازگشتی این تابع تعداد بایتی است که توانسته ارسال کند. اگر این مقدار کمتر از len باشد ما موظیم مابقی buf را مجدد از طریق تابع ()send ارسال کنیم.

مثال ارسال Hello world برروی بستر SOCK_STREAM توسط تابع ()send :

#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;
}

کلاینت

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

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