我剛開始學習socket編程,發現它很有趣。 目前,我正在服務器和客戶端在同一臺計算機上,因此我可以有IP地址作爲環回地址,127.0.0.1和一切似乎工作正常!初學者的Socket編程C
但現在我正在考慮有兩臺電腦,做這件事.. 我有以下問題 - 1)說一臺電腦是服務器,另一臺是客戶端。現在,如果服務器代碼駐留在服務器計算機上並且客戶端上的客戶端代碼是? 2)在我們爲bind()提供ip地址的服務器代碼中,它應該是我們可以通過ipconfig找到的系統的ip地址,或者它應該仍然是回送地址? 3)在客戶端代碼中,我猜目的地的IP地址應該是服務器計算機的IP地址? 4)最後也是最重要的事情,我如何連接兩臺計算機?
我附加了我開始使用的簡單服務器和客戶端消息傳遞代碼。請指導我,我需要進行更改..
服務器代碼
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#define MYPORT 3500
int main()
{
int sockfd;
int clientfd;
int bytes_read;
char buf[100];
int struct_size;
struct sockaddr_in my_addr;
struct sockaddr_in con_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
my_addr.sin_zero[8]='\0';
bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
listen(sockfd,5);
struct_size = sizeof(con_addr);
clientfd = accept(sockfd, (struct sockaddr*)&con_addr, &struct_size);
bytes_read = read(clientfd, buf, 100);
buf[bytes_read] = '\0';
printf("Message from client:%d is %s \n",clientfd, buf);
close(sockfd);
close(clientfd);
}
客戶端代碼
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<string.h>
#include<stdio.h>
#define DESTPORT 3500
int main()
{
struct sockaddr_in dest_addr;
int sockfd = socket(AF_INET,SOCK_STREAM,0);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(DESTPORT);
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
dest_addr.sin_zero[8]='\0';
connect(sockfd,(struct sockaddr*)&dest_addr, sizeof(struct sockaddr));
char msg[100];
printf("Enter you message: ");
gets(&msg);
int w = write(sockfd, msg, strlen(msg));
close(sockfd);
printf("Client Dying.....\n");
return 0;
}
解決我的情況只是我想要的方式..謝謝噸:-) 你可以建議一些很好的資源來了解有關現代套接字編程? – sachin11 2011-04-26 14:52:15
對於'getaddrinfo','getnameinfo','socket','bind','''''''''''''''''''''''基本上是man頁面(或POSIX文檔,這裏是:http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html) connect','listen','accept','sendto','recvfrom'和'select'就是您所需要的全部。您在較舊的示例和教程中看到的所有複雜性只是傳統的包袱,並且不利於IPv6的支持和可移植性。 – 2011-04-26 14:55:58
你爲什麼不在任何地方指定端口? – JeremyP 2011-04-26 15:08:45