问题描述
下一个代码(改编自Rochkind的书),展示了一个客户端服务器应用程序,该应用程序将unix套接字与客户端和服务器一起使用unix套接字,并通过使用fork的父子关系进行关联。由于某种原因,程序被阻止了,我不知道为什么。该程序将打印以下行
[Server] ==> Socket 3 has been created
[Server] ==> Socket 3 has been boud to address
[Server] ==> Listening for incoming messages
[Client] ==> Socket 3 has been created
[Client] ==> Connection has been established .. let us write to server
[Server] ==> let us read from client
[Client] ==> 7 bytes written to server
[Client] ==> Now let us read from server
然后阻止。谁能帮助我检测到错误?非常感谢。
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#define SOCKETNAME "MySocket"
int main(void) {
struct sockaddr_un sa;
(void)unlink(SOCKETNAME);
strcpy(sa.sun_path,SOCKETNAME);
sa.sun_family = AF_UNIX;
int fd_skt,fd_client; char buf[100];
int written; ssize_t readb;
if (fork() == 0) { /* client */
if ((fd_skt = socket(PF_UNIX,SOCK_STREAM,0)) < 0) {
perror("Message from socket [client] : ");
exit(-1); }
printf ("[Client] ==> Socket %d has been created\n",fd_skt);
// Since cliend and server run concurrently,it is possible for the client
// to call connect before the creation of the socket file by the server (ENOENT).
// In this case the function sleeps for a second and tries again. If something
// else goes wrong,the function fails.
while (connect(fd_skt,(struct sockaddr *)&sa,sizeof(sa)) == -1) {
if (errno == ENOENT) {
sleep(1); continue; }
else {
perror("Message from connect [client]");
exit(-2); }}
// After connection the client and the server can communicate each other
// using read and write functions
printf ("[Client] ==> Connection has been established .. let us write to server\n");
written = write(fd_skt,"Hello!",7);
if (written==-1) {
perror("Message from write [client]");
exit(-3); }
else printf ("[Client] ==> %d bytes written to server\n",written);
printf ("[Client] ==> Now let us read from server\n");
readb = read(fd_skt,buf,sizeof(buf));
if (readb==-1) {
perror("Message from read [client]");
exit(-4); }
printf("Client got %s\n",buf);
close(fd_skt);
exit(0); }
else { /* server */
if ((fd_skt = socket(PF_UNIX,0)) < 0) {
perror("Message from socket [server]");
exit(-1); }
printf ("[Server] ==> Socket %d has been created\n",fd_skt);
if (bind(fd_skt,(struct sockaddr *) &sa,sizeof(sa))){
perror("Message from bind [server]");
exit(-2); }
printf ("[Server] ==> Socket %d has been boud to address\n",fd_skt);
if (listen(fd_skt,5)){
perror("Message from listen [server]");
exit(-3); }
printf ("[Server] ==> Listening for incoming messages\n");
if (fd_client = accept(fd_skt,NULL,0)<0) {
perror("Message from accept [server]");
exit(-4); }
printf ("[Server] ==> let us read from client\n");
if (read(fd_client,sizeof(buf))==-1) {
perror("Message from read [server] : ");
exit(-5); }
printf("Server got %s\n",buf);
printf ("[Server] ==> let us write to client\n");
if (write(fd_client,"Goodbye!",9)==-1) {
perror("Message from write [server]");
exit(-6); }
close(fd_skt);
close(fd_client);
exit(0); }}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)