我刚开始学习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