====== تابع ()send ====== از این تابع برای نوشتن در یک سوکت از نوع stream استفاده می شود. #include #include ssize_t send(int sockfd, const void *buf, size_t len, int flags); مقدار بازگشتی این تابع تعداد بایتی است که توانسته ارسال کند. اگر این مقدار کمتر از len باشد ما موظیم مابقی buf را مجدد از طریق [[send]] ارسال کنیم. مثال ارسال Hello world برروی بستر SOCK_STREAM توسط [[send]] : #include #include #include #include #include #include #include #include #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