我在尝试创建一个简单的unix套接字程序时遇到了一些错误。到目前为止,我的服务器程序正在运行。我正在尝试编写一个程序,让客户端重复向服务器程序发送消息,服务器将显示它们。我打开了两个编译器窗口来测试它。我收到错误,我认为这些错误与头文件或unix特定内容有关。我尝试使用“sun_addr”代替“sin_addr”(对于unix),但它没有用。
错误......(在改变所有“联合国”而不是“在”之后编辑)
error:'struct sockaddr_un' has no member named 'sun_port'
...代码
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/un.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#define LEN 256
#define SOCKET_NAME "client_socket"
int main(void)
{
char message[LEN];
int sock;
struct sockaddr_un server_socket;
char server_reply[LEN];
//create af_unix/socket stream w/call to socket func
sock = socket(AF_UNIX , SOCK_STREAM , 0);
if(sock == -1)
{
perror("Could not create socket");
}
puts("Socket created");
//errors and warnings here...
server_socket.sun_family = AF_UNIX;
server_socket.sun_port = htons( 8888 );//or use sun_path?
if(connect(sock ,(struct sockaddr *)&server_socket, sizeof(server_socket))
<0)
{
perror("Connect failed.");
return 1;
}
puts("Connected\n");
while(1)
{
printf("Enter message : ");
scanf("%s" , message);
//Send some data
if( send(sock , message , strlen(message) , 0) < 0)
{
puts("Send failed");
return 1;
}
//Receive a reply from the server
if( recv(sock , server_reply , 2000 , 0) < 0)
{
puts("recv failed");
break;
}
puts("Server reply :");
puts(server_reply);
}
close(sock);
return 0;
}
答案 0 :(得分:1)
这是sockaddr_un
的定义,它没有像sin_family和其他错误报告的成员。
struct sockaddr_un{
short sun_family; /*AF_UNIX*/
char sun_PATH[108]; /*path name */
};
您认为正在使用的结构就是这个
struct sockaddr_in {
short sin_family; /* AF_INET */
u_short sin_port; /* 16-bit port number */
struct in_addr sin_addr;
char sin_zero[8]; /* unused */
};
struct in_addr {
u_long s_addr; /*32-bit net id */
};
我认为你正在混合像AF_INET和AF_UNIX这样的家族的处理。以下是为AF_INET写的方法。
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 12345
int main()
{
struct sockaddr_in addr;
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1)
{
printf("Error opening socket\n");
return -1;
}
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = 0;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
{
printf("Error binding socket\n");
return -1;
}
printf("Successfully bound to port %u\n", PORT);
}
对于AF_UNIX,您可以查看此示例和其他相关示例 Client/Server Socket Communication (AF_UNIX)