今天要写的内容是来实验 send( , ,) 中的第二个参数是否可以使用 char *str 指针。
结论是:可以!
服务端的代码如下:
/* 2012-06-07 - 代码是在 http://beej.us/guide/bgipc/output/html/multipage/unixsock.html 基础上修改的。原始的代码下载
* echos.c -- the echo server for echoc.c; demonstrates unix sockets
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCK_PATH "/home/tian/mysocket"
int main(void)
{
int s, s2, t, len;
struct sockaddr_un local, remote;
char str[100];
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
local.sun_family = AF_UNIX;
strcpy(local.sun_path, SOCK_PATH);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(s, (struct sockaddr *)&local, len) == -1) {
perror("bind");
exit(1);
}
if (listen(s, 5) == -1) {
perror("listen");
exit(1);
}
for(;;)
{
int done, n;
printf("Waiting for a connection...\n");
t = sizeof(remote);
if ((s2 = accept(s, (struct sockaddr *)&remote, &t)) == -1) {
perror("accept");
exit(1);
}
printf("Connected.\n");
do
{
memset(str, 0, sizeof(str));
n = recv(s2, str, 5, 0);
if (n < 0)
{
perror("recv");
break;
}
else if (n == 0)
{
break;
}
//
printf("echo> %s\n", str);
//
} while (1);
close(s2);
}
return 0;
}
服务端执行结果截图:
客户端代码如下:
/* 2012-06-07 - 代码是在 http://beej.us/guide/bgipc/output/html/multipage/unixsock.html 基础上修改的。原始的代码下载
** echoc.c -- the echo client for echos.c; demonstrates unix sockets
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCK_PATH "/home/tian/mysocket"
int main(void)
{
int s, t, len;
struct sockaddr_un remote;
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
printf("Trying to connect...\n");
remote.sun_family = AF_UNIX;
strcpy(remote.sun_path, SOCK_PATH);
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
if (connect(s, (struct sockaddr *)&remote, len) == -1) {
perror("connect");
exit(1);
}
printf("Connected.\n");
int num = 5;
char *str = (char*)calloc(5, sizeof(char));
while(1)
{
sprintf(str, "%d", num); //将 num 以10进制格式化到 str
//
printf("strlen---%d\n", strlen(str)); // 打印 str 的长度
//
if (send(s, str, strlen(str), 0) == -1)
{
perror("send");
exit(1);
}
printf("num---%d\n", num); // 打印 num,以此判断 while() 循环是否正确执行
num--;
if(num == 0) break;
}
if (str != NULL)
{
str = NULL;
free(str); // 释放 str 占用的内存空间
}
close(s);
return 0;
}
客户端执行结果截图:
根据服务端与客户端执行结果,可以判断出:程序执行正常。