网络编程

 

 

 

客户端:

#include <stdio.h>

#include <sys/socket.h>

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

#include <arpa/inet.h>

#include <string.h>

 

 

 

#define SERPORT              9003

#define SERADDR             "192.168.1.141"               // ifconfig看到的

#define BACKLOG             100

 

 

char recvbuf[100];

 

#define CMD_REGISTER 1001         // 注册学生信息

#define CMD_CHECK                1002         // 检验学生信息

#define CMD_GETINFO            1003         // 获取学生信息

 

#define STAT_OK                         30              // 回复ok

#define STAT_ERR             31              // 回复出错了

 

typedef struct commu

{

         char name[20];                  // 学生姓名

         int age;                       // 学生年龄

         int cmd;                      // 命令码

         int stat;                      // 状态信息,用来回复

}info;

 

 

int main(void)

{

         // 第1步:先socket打开文件描述符

         int sockfd = -1, ret = -1, clifd = -1;

         socklen_t len = 0;

         struct sockaddr_in seraddr = {0};

         struct sockaddr_in cliaddr = {0};

        

         char ipbuf[30] = {0};

        

        

         sockfd = socket(AF_INET, SOCK_STREAM, 0);

         if (-1 == sockfd)

         {

                   perror("socket");

                   return -1;

         }

         printf("socketfd = %d.\n", sockfd);

        

         // 第2步:bind绑定sockefd和当前电脑的ip地址&端口号

         seraddr.sin_family = AF_INET;                   // 设置地址族为IPv4

         seraddr.sin_port = htons(SERPORT);       // 设置地址的端口号信息

         seraddr.sin_addr.s_addr = inet_addr(SERADDR);  // 设置IP地址

         ret = bind(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));

         if (ret < 0)

         {

                   perror("bind");

                   return -1;

         }

         printf("bind success.\n");

        

         // 第三步:listen监听端口

         ret = listen(sockfd, BACKLOG);                  // 阻塞等待客户端来连接服务器

         if (ret < 0)

         {

                   perror("listen");

                   return -1;

         }

        

         // 第四步:accept阻塞等待客户端接入

         clifd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);

         printf("连接已经建立,client fd = %d.\n", clifd);

        

 

 

         // 客户端反复给服务器发

         while (1)

         {

                   info st;

                   // 回合中第1步:服务器收

                   ret = recv(clifd, &st, sizeof(info), 0);

 

                   // 回合中第2步:服务器解析客户端数据包,然后干活,

                   if (st.cmd == CMD_REGISTER)

                   {

                            printf("用户要注册学生信息\n");

                            printf("学生姓名:%s,学生年龄:%d\n", st.name, st.age);

                            // 在这里服务器要进行真正的注册动作,一般是插入数据库一条信息

                           

                            // 回合中第3步:回复客户端

                            st.stat = STAT_OK;

                            ret = send(clifd, &st, sizeof(info), 0);

                   }

                  

                   if (st.cmd == CMD_CHECK)

                   {

                           

                   }

                  

                   if (st.cmd == CMD_GETINFO)

                   {

                           

                   }

 

         }

 

         return 0;

}

 

服务端

#include <stdio.h>

#include <sys/socket.h>

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

#include <arpa/inet.h>

#include <string.h>

 

 

#define SERADDR             "192.168.63.128"             // 服务器开放给我们的IP地址和端口号

#define SERPORT              9003

 

 

char sendbuf[100];

char recvbuf[100];

 

 

#define CMD_REGISTER 1001         // 注册学生信息

#define CMD_CHECK                1002         // 检验学生信息

#define CMD_GETINFO            1003         // 获取学生信息

 

#define STAT_OK                         30              // 回复ok

#define STAT_ERR             31              // 回复出错了

 

 

typedef struct commu

{

         char name[20];                  // 学生姓名

         int age;                       // 学生年龄

         int cmd;                      // 命令码

         int stat;                      // 状态信息,用来回复

}info;

 

 

 

int main(void)

{

         // 第1步:先socket打开文件描述符

         int sockfd = -1, ret = -1;

         struct sockaddr_in seraddr = {0};

         struct sockaddr_in cliaddr = {0};

        

         // 第1步:socket

         sockfd = socket(AF_INET, SOCK_STREAM, 0);

         if (-1 == sockfd)

         {

                   perror("socket");

                   return -1;

         }

         printf("socketfd = %d.\n", sockfd);

        

         // 第2步:connect链接服务器

         seraddr.sin_family = AF_INET;                   // 设置地址族为IPv4

         seraddr.sin_port = htons(SERPORT);       // 设置地址的端口号信息

         seraddr.sin_addr.s_addr = inet_addr(SERADDR);  // 设置IP地址

         ret = connect(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));

         if (ret < 0)

         {

                   perror("listen");

                   return -1;

         }

         printf("成功建立连接\n");

 

/*

         while (1)

         {

                   // 回合中第1步:客户端给服务器发送信息

                   printf("请输入要发送的内容\n");

                   scanf("%s", sendbuf);

                   //printf("刚才输入的是:%s\n", sendbuf);

                   ret = send(sockfd, sendbuf, strlen(sendbuf), 0);

                   printf("发送了%d个字符\n", ret);

                  

                   // 回合中第2步:客户端接收服务器的回复

                   memset(recvbuf, 0, sizeof(recvbuf));

                   ret = recv(sockfd, recvbuf, sizeof(recvbuf), 0);

                   //printf("成功接收了%d个字节\n", ret);

                   printf("client发送过来的内容是:%s\n", recvbuf);

 

                   // 回合中第3步:客户端解析服务器的回复,再做下一步定夺

                  

         }

*/

 

         while (1)

         {

                   // 回合中第1步:客户端给服务器发送信息

                   info st1;

                   printf("请输入学生姓名\n");

                   scanf("%s", st1.name);

                   printf("请输入学生年龄");

                   scanf("%d", &st1.age);

                   st1.cmd = CMD_REGISTER;

                   //printf("刚才输入的是:%s\n", sendbuf);

                   ret = send(sockfd, &st1, sizeof(info), 0);

                   printf("发送了1个学生信息\n");

                  

                   // 回合中第2步:客户端接收服务器的回复

                   memset(&st1, 0, sizeof(st1));

                   ret = recv(sockfd, &st1, sizeof(st1), 0);

                  

                   // 回合中第3步:客户端解析服务器的回复,再做下一步定夺

                   if (st1.stat == STAT_OK)

                   {

                            printf("注册学生信息成功\n");

                   }

                   else

                   {

                            printf("注册学生信息失败\n");

                   }

 

         }

 

 

 

         return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值