- 论坛徽章:
- 1
|
回复 1# 嵌入式陌生人
我修改了你的代码,没有你说的问题,下面是服务端的代码
- #include <stdlib.h>//不加会报隐式声明与内建函数'exit'不兼容
- #include <stdio.h>
- #include <sys/socket.h>
- #include <string.h>
- #include <netinet/in.h>//因用了地址(网络编程用的地址)
- #include <arpa/inet.h>
- #include <unistd.h>
- #define MSG_SIZE 128
- int main(int argc,char* argv[])
- {
- int sockfd;
- int checkBind;
- char buf[MSG_SIZE];
- struct sockaddr_in sever_addr; //服务器的IP地址
- struct sockaddr_in client_addr; //用来存客户端的IP地址
- socklen_t addrlen;
- int n;//用来定位到buf的尾巴,添加字符串结束符‘\0’
- int portnum = 6666;
- //1.创建套接字
- sockfd = socket(AF_INET, SOCK_DGRAM, 0); //SOCK_DGRAM表示的是UDP协议的套接字,AF_INET表IPV4
- if (sockfd < 0) {
- perror("server socket error!\n");
- exit(1);
- }
- if (argc > 1) {
- portnum = atoi(argv[1]);
- }
- //2.0设置要绑定的服务器地址
- bzero(&sever_addr, sizeof(struct sockaddr_in));
- sever_addr.sin_family = AF_INET;
- sever_addr.sin_port = htons(portnum);//先要将主机字节序转换成网络字节序
- //sever_addr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定任意的IP地址,要和网络上所有的IP地址通讯
- sever_addr.sin_addr.s_addr = INADDR_ANY;
- //2.1绑定地址
- checkBind = bind(sockfd, (struct sockaddr *)(&sever_addr), sizeof(struct sockaddr_in));
- if (checkBind < 0) {
- perror("server bind error!\n");
- exit(1);
- }
- addrlen = sizeof(struct sockaddr_in);
- //3.接收数据
- while (1) {
- bzero(buf, sizeof(buf));
- memset(&client_addr, 0, sizeof(struct sockaddr_in));
- n = recvfrom(sockfd, buf, MSG_SIZE, 0, (struct sockaddr *)(&client_addr), &addrlen);
- if (n < 0) {
- perror("sever recvfrom error!\n");
- printf("n = %d\n", n);
- exit(1);
- }
- printf("sever get connection from %s\n", inet_ntoa(client_addr.sin_addr));
- buf[n] = 0;//0即为‘\0’
- printf("server received: %s\n", buf);
- }
- //4.关闭连接
- close(sockfd);
- return 0;
- }
复制代码
下面是客户端的代码
- #include <stdlib.h>//不加会报隐式声明与内建函数'exit'不兼容
- #include <stdio.h>
- #include <sys/socket.h>
- #include <string.h>
- #include <netinet/in.h>//因用了地址(网络编程用的地址)
- #include <arpa/inet.h>
- #include <unistd.h>
- #define BUF_SIZE 128
- int main(int argc, char** argv)
- {
- int sockfd;
- char buf[BUF_SIZE];
- struct sockaddr_in sever_addr; //服务器的IP地址
- int portnum = 6666;
- char *prets=NULL;
- if (argc != 2) { //输入格式检查
- printf("Usage: %s server_ip\n", argv[0]);
- exit(1);
- }
- if (argc > 2) {
- portnum = atoi(argv[2]);
- }
- //1.创建套接字
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sockfd < 0) {
- perror("server socket error\n");
- exit(1);
- }
- //2.0初始化服务器地址
- bzero(&sever_addr, sizeof(struct sockaddr_in));
- sever_addr.sin_family = AF_INET;
- sever_addr.sin_port = htons(portnum);//先要将主机字节序转换成网络字节序
- inet_aton(argv[1], &sever_addr.sin_addr); //inet_aton是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址。
- //2.1发送数据
- while (1) {
- printf("please input char:\n");
- prets = fgets(buf, BUF_SIZE, stdin);
- if (prets == NULL) {
- break;
- }
- sendto(sockfd, buf, BUF_SIZE, 0, (struct sockaddr *)(&sever_addr), sizeof(struct sockaddr));
- bzero(buf, BUF_SIZE);
- }
- //3.关闭连接
- close(sockfd);
- return 0;
- }
复制代码
|
|