از این تابع برای نوشتن در یک سوکت از نوع 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