====== تابع ()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