[英]libusb_claim_interface fails on Mac OS X Mountain Lion
[英]Trouble with running Server-Client c program on Mac OS X Mountain Lion
我剛剛開始學習使用c進行UNIX網絡編程,並制作了一個小型TCP Server-Client程序。
它在Fedora上運行完美,但在MacBook上存在一些連接問題。
可以毫無問題地在終端中完成編譯,但是在我運行“服務器”程序然后運行“客戶端”程序之后,似乎“服務器”沒有從“客戶端”獲得“連接”命令。 代碼和消息如下:
server.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define MYPORT 1500
#define BACKLOG 5
#define MAXDATASIZE 100
int main()
{
int servSock, cliProc;
socklen_t sin_size;
char buf[MAXDATASIZE], msg[MAXDATASIZE];
struct sockaddr_in my_addr, income_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if ((servSock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
printf("Socket Error: %d\n", errno);
else
printf("Server Socket %d created\n", servSock);
if (bind(servSock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
printf("Bind Error: %d\n", errno);
else
printf("Server Bind created\n");
listen(servSock, BACKLOG);
printf("Server is waitting for connection...\n");
sin_size = sizeof(struct sockaddr_in);
if ((cliProc = accept(servSock, (struct sockaddr *)&income_addr, &sin_size)) == -1)
printf("Accept Error: %d\n", errno);
else
{
printf("Server accepted connection from %s\n", inet_ntoa(income_addr.sin_addr));
}
sprintf(msg, "Welcome to Server, you addr is %s", inet_ntoa(income_addr.sin_addr));
send(cliProc, msg, strlen(msg), 0);
if (recv(cliProc, buf, MAXDATASIZE, 0) == -1)
{
printf("Recv Error: %d\n", errno);
}
else
{
printf("Server received %s from %s\n", buf, inet_ntoa(income_addr.sin_addr));
}
close(cliProc);
close(servSock);
printf("Server Sockets closed\n");
return 0;
}
client.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define MAXDATASIZE 100
#define PORT 1500
int main(int argc, char *argv[])
{
int cliSock, numbytes;
char buf[MAXDATASIZE], msg[MAXDATASIZE];
if (argc != 2)
{
printf("%d, Usage: Client Hostname\n", argc);
exit(1);
}
struct hostent *he;
if ((he = gethostbyname(argv[1])) == NULL)
{
printf("Couldn't get hostname\n");
exit(1);
}
struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(PORT);
dest_addr.sin_addr = *((struct in_addr *)he->h_addr);
if ((cliSock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
printf("Socket Error: %d\n", errno);
else
printf("Client Socket %d created\n", cliSock);
if (connect(cliSock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == 1)
printf("Connect Error: %d\n", errno);
else
{
printf("Client Connection created\n");
}
numbytes = recv(cliSock, buf, MAXDATASIZE, 0);
buf[numbytes] = '\0';
printf("Received Message: %s\n", buf);
sprintf(msg, "4 8 15 16 23 42");
send(cliSock, msg, MAXDATASIZE, 0);
printf("Client sent %s to %s\n", msg, inet_ntoa(dest_addr.sin_addr));
close(cliSock);
printf("Client Sockets closed\n");
return 0;
}
服務器信息:
Server Socket 3 created
Server Bind created
Server is waitting for connection...
客戶端消息:
Client Socket 3 created
Client Connection created
Received Message:
任何幫助將是感激的。 :)
a)在您的服務器上,添加驗證以檢查listen
是否成功。 可能會失敗。 您可以通過以下方式找出原因:
fprintf(stderr, "Error: %s\n", strerror(errno));
b)在您的客戶上,以下情況正在檢查錯誤的值。 它應該檢查!= 0
。 引用connect : If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.
If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.
。
if (connect(cliSock,(struct sockaddr *)&dest_addr,sizeof(struct sockaddr)) == 1)
printf("Connect Error: %d\n", errno);
else
printf("Client Connection created\n");
c)在像您這樣的情況下,通常建議您與已知有效的客戶端(例如telnet
或netcat)測試連接。 這有助於減小驗證區域。 如果連接失敗,則問題出在服務器上。 否則,這是您的客戶的問題。 當然,您仍然可能同時遇到這兩個問題,但是您需要一次修復一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.