设为首页 收藏本站
查看: 846|回复: 0

[经验分享] 虚拟机(vmware)下实现linux网络编程(使用socket编程)

[复制链接]

尚未签到

发表于 2015-4-8 10:08:18 | 显示全部楼层 |阅读模式
  先是建立服务器程序:
  #include
#include
#include
#include
#include
#include
#include
  
  #define MYPORT 5858
#define BACKLOG 10
#define MAXSIZE 80
#define BUFSIZE 100
  //单独的数据处理 就是简单的从client端接受数据, 然后又发给client端
  void str_ser(int new_fd) {
char buf[MAXSIZE];
int n = 0;
  while(1) {
if((n=recv(new_fd, buf, MAXSIZE, 0)) == 0) {
printf("error in recv!\n");
return ;
}
printf("server data is %s", buf);
send(new_fd, buf, n, 0);
bzero(buf, MAXSIZE);
}
}
  int main() {
int socketfd, new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
pid_t pid;
  if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("error in socket function!\n");
exit(1);
}
  my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero), 8);
  if((bind(socketfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))) < 0) {
printf("error in bind function!\n");
exit(1);
}
  if(listen(socketfd, BACKLOG) < 0) {
printf("error in listen function!\n");
exit(1);
}
  while(1) {
printf("start accept\n");
sin_size = sizeof(struct sockaddr_in);
if((new_fd=accept(socketfd, (struct sockaddr *)&their_addr ,&sin_size)) < 0) {
printf("error in accept() function!\n");
exit(1);
}
  if((pid=fork())==0) {
close(socketfd);
str_ser(new_fd);
close(new_fd);
exit(0);
}else {
close(new_fd);
  }
}
  close(socketfd);
exit(0);
}
//下面是client端的程序:                                                                              boxiang.blogbus.com
  #include
#include
#include
#include
#include
#include
#include
#include
  #include
  #define MAXSIZE 100
#define MYPORT 5858
  
extern int errno;
  //单独处理数据的函数,发给服务器, 然后接受服务器的数据
  void str_cli(int sockfd) {
char sends[MAXSIZE];
char recvs[MAXSIZE];
int n=0;
while(fgets(sends, MAXSIZE, stdin) != NULL) {
printf("client data is %s\n", sends);
send(sockfd, sends, strlen(sends), 0);
if((n=recv(sockfd, recvs, MAXSIZE, 0)) == 0) {
printf("error in recv !\n");
exit(1);
}
  recvs[n] = 0;
printf("client recv data is %s\n", recvs);
//fputs(recvs, stdout);
bzero(recvs, n);
bzero(sends, MAXSIZE);
}
}
  
int main(int args, char *argv[]) {
int sockfd;
int ret;
struct servent *serv;
struct hostent *sh;
struct in_addr **addrs;
struct sockaddr_in ser_addr;
struct sockaddr_in addr;
char **addres;
char ip[]="127.0.0.1";
  if(args != 2) {
printf("error in paramter!\n");
exit(1);
}
  /*if((sh=gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr), AF_INET)) == NULL) {
printf("error in gethostbyaddr!\n");
exit(1);
}*/
  /*if((serv=getservbyname(sh->h_name, NULL)) == NULL) {
printf("error in getservbyname!\n");
perror("getservbyname");
exit(1);
  }*/
  ///////////////////首先通过服务器域名获得其IP地址,然后创建一个socket,调用connect函数与服务器建立连
  //接, 要进行connect链接 首先要有服务器的ip和port端口,port首先可以自己定义,看看服务器端口,端口port定义是5858, 所以client端口port也就是5858,(说点小插曲,以前想通过gethostbyaddr,获得h->home, 肯定是可以的 但是hostent数据结构里面是没有port的,我就想通过getservbyname,因为servent里面有port这个属性,可是就是得不到 呵呵呵 真是笨啊 根本就得不到 getservent只能获得相应服务的对应端口)   地方必须说一下,我自己理解是gethostbyname是先在/etc/hosts文件里面去读取 你对应的域名,得到ip地址, 如果没有就是去电脑的dns里面去找域名相应的ip地址,而那个getservbyname是去/etc/services去读取相应服务的端口啊
  
  
if((sh=gethostbyname(argv[1]))==NULL) {
printf("error in gethostbyname !\n");
exit(1);
}
addrs = (struct in_addr **)sh->h_addr_list;
  
for(; (*addrs)!=NULL; addrs++) {
if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("error in socket!\n");
exit(1);
}
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(MYPORT);
//memcpy(&(ser_addr.sin_addr),(struct in_addr *)ip, sizeof(struct in_addr));
printf("ip is :%s\n", inet_ntoa(**addrs));
memcpy(&(ser_addr.sin_addr), *addrs, sizeof(struct in_addr));
ret = connect(sockfd, (struct sockaddr*)&ser_addr, sizeof(struct sockaddr));
if(ret == 0) {
printf("is ok\n");
break;
  }else {
printf("error in connect function!\n");
close(sockfd);
}
}
  if((*addrs) == NULL) {
printf("error in found addr and port in this server!\n");
exit(1);
}
  str_cli(sockfd);
  close(sockfd);
exit(0);
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-54932-1-1.html 上篇帖子: VMware中虚拟的linux系统空间不足增加硬盘的办法 下篇帖子: VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表