
哦字符串回显啊unix网络编程有好几个版本,你可以去网上下它的源代码(百度搜UNIX网络编程 源代码),呃大部分被我的改的不成样了,发个能用的给看看吧
//server#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<signal.h>
#define SERVPORT 1956
#define MAXLINE 100
typedef void Sigfunc(int)
void sig_chld(int signo)
{
pid_t pid
int stat
while( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated\n", pid)
return
}
//read data from client, and write back to them
void str_echo(int sockfd)
{
ssize_t n
char buf[MAXLINE]
again:
while( (n = read(sockfd, buf, MAXLINE)) > 0 )
write(sockfd, buf, n)
if(n < 0 && errno ==EINTR)
goto again
else if(n < 0 )
printf("error\n")
}
int main(int argc, char** argv)
{
int listenfd, connfd
socklen_t clilen
pid_t childpid
struct sockaddr_in servaddr, cliaddr
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
printf("socket fd error\n")
return -1
}
bzero(&servaddr, sizeof(servaddr))
servaddr.sin_family = AF_INET
servaddr.sin_addr.s_addr = htonl(INADDR_ANY)
servaddr.sin_port = htons(SERVPORT)
if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) <0 )
{
printf("bind error\n")
return -1
}
int backlong = 0
if(listen(listenfd, backlong) <0 )
{
printf("listen error\n")
return -1
}
signal(SIGCHLD, sig_chld)
for()
{
clilen = sizeof(cliaddr)
if( (connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)) < 0)
{
if(errno == EINTR) continue
else printf("accept error\n")
return 0
}
printf("accept \n")
if( (childpid = fork()) == 0 )
{
close(listenfd) //close child's listen socket
str_echo(connfd)
exit(0)
}
close(connfd)
}
} //client
#include<stdio.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 10
int main(int argc, char ** argv)
{
int sockfd, n
char recvline[MAXLINE+1]
struct sockaddr_in servaddr,binaddr
if(argc != 2)
{
printf("usage: <IPADDRESS>\n")
return -1
}
if( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
printf("socket error\n")
return -1
}
bzero(&servaddr, sizeof(servaddr))
servaddr.sin_family = AF_INET
servaddr.sin_port = htons(15)
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0 )
{
printf("inet_pton error for &s \n", argv[1])
return -1
}
int bindSock
binaddr.sin_family = AF_INET
inet_pton(AF_INET, "222.26.224.56", &binaddr.sin_addr)
binaddr.sin_port = htons(20000)
int reuse0 = 1
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse0, sizeof(reuse0)) == -1)
{
printf("set socket error\n")
return -1
}
if( bind(sockfd, (struct sockaddr *)&binaddr, sizeof(servaddr)) <0 )
{
printf("bind error\n")
return -1
}
if( connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr) ) < 0 )
{
printf("connection refuse\n")
return -1
}
while( (n = read(sockfd, recvline, MAXLINE)) > 0 )
{
recvline[n] = 0
if(fputs(recvline, stdout) == EOF)
{
printf("fputs error")
return -1
}
printf("\n")
}
if(n < 0 )
{
printf("read error")
return -1
}
}
Socket通信创建步骤:
(1)通过socket()函数创建socket
(2)通过bind函数绑定socket于设备地址
(3)进行读写 *** 作read/recv/recvfrom write/send/sendto
(4)close方法关闭套接字
例子如下:
test1.c
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
//create socket
int fd = socket(AF_INET, SOCK_DGRAM, 0)
if(fd==-1)
{
perror("socket\n")
exit(-1)
}
printf("socket fd=%d\n",fd)
//build connection address
struct sockaddr_in addr
addr.sin_family = AF_INET
addr.sin_port = htons(6666)
addr.sin_addr.s_addr = inet_addr("127.0.0.1")
int r
r = bind(fd,(struct sockaddr*)&addr,sizeof(addr))
if(r==-1)
{
perror("bind")
close(fd)
exit(-1)
}
printf("bind address successful!\n")
//accept or send message
char buf[255]
struct sockaddr_in from
socklen_t len
len = sizeof(from)
while(1)
{
r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len)
if(r>0)
{
buf[r]=0
printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf)
}
else
{
break
}
}
//close socket
close(fd)
return 0
}
test2.c
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
//create socket
int fd = socket(AF_INET,SOCK_DGRAM,0)
if(fd==-1)
{
perror("socket")
exit(-1)
}
printf("create socket OK!\n")
//create an send address
struct sockaddr_in addr={}
addr.sin_family = AF_INET
addr.sin_port = htons(6666)
addr.sin_addr.s_addr=inet_addr("127.0.0.1")
//send the message to the specify address
int r
char buf[255]
while(1)
{
r = read(0,buf,sizeof(buf)-1)
if(r<=0)
break
sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr))
}
//close socket
close(fd)
return 0
}
先运行test1.c,然后运行test2.c,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息
运行结果如下:
socket编程一般是基于tcp或者udp协议来写的,你的问题很抽象,我不知道你要的是基于tcp还是udp的socket编译。我把相对难的基于tcp协议的socket编译给你吧。你想看懂我的代码需要知道tcp的三次握手机制。否则我写了注释,你看代码也有点困难。 ////服务端的代码1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <arpa/inet.h>
9
10 #define LOCAL_PORT 1234
11 #define MAX_LEN 512
12 #define MAX_NUM 5
13
14 int main(int argc, char *argv[])
15 {
16 int sock_fd, sock_data
17 int ret, len_addr
18 char buf[MAX_LEN]
19 ssize_t len
20 struct sockaddr_in local_addr, remote_addr
21
22 sock_fd = socket(AF_INET, SOCK_STREAM, 0)//创建套接字,sock_fd是套接字描述符,类似我们的身份z号码
23 if (sock_fd <0)
24 {
25 perror("socket()")
26 return sock_fd
27 }
28
29 local_addr.sin_family = AF_INET// 协议族,ipv4
30 local_addr.sin_port = htons(LOCAL_PORT)// 把服务器端口转换成网络字节序
31 local_addr.sin_addr.s_addr = inet_addr("127.0.0.1")//把字符串形式的ip转换成网络字节序
32
33 ret = bind(sock_fd, (struct sockaddr *)&local_addr, (size_t)sizeof(local_addr))// 把sock_fd和本机ip,端口邦定
34 if (ret <0)
35 {
36 perror("bind()")
37 close(sock_fd)
38 return ret
39 }
40
41 ret = listen(sock_fd, MAX_NUM)//监听socket
42 if (ret)
43 {
44 perror("listen()")
45 close(sock_fd)
46 return ret
47 }
48
49 memset(buf, 0, MAX_LEN)
50
51 len_addr = sizeof(remote_addr)
52
53 sock_data = accept(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&len_addr)//接受客户端的连接
54 if (ret <0)
55 {
56 perror("accept()")
57 close(sock_fd)
58 return ret
59 }
60
61 while (1)
62 {
63 int slen
64 len = recv(sock_data, buf, MAX_LEN, 0)//接受客户端的数据
65 if (len <0)
66 {
67 perror("recv()")
68 close(sock_data)
69 close(sock_fd)
70 return len
71 }
72 printf("%s\n", buf)
73
74 slen = send(sock_data, "congratulation!", 15, 0)//向客户端发送数据
75 if (slen <= 0)
76 {
77 printf("slen = %d\n", slen)
78 perror("send()")
79 close(sock_data)
80 close(sock_fd)
81 return slen
82 }
83 sleep(1)
84 }
85
86 close(sock_data)
87 close(sock_fd)
88
89 return 0
90 }
////////////客户端的代码 1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <arpa/inet.h>
9
10 #define REMOTE_PORT 1234
11 #define MAX_LEN 512
12
13 int main(int argc, char *argv[])
14 {
15 int sock_fd, ret
16 int len
17 char buf[MAX_LEN]
18 struct sockaddr_in local_addr, remote_addr
19
20 sock_fd = socket(AF_INET, SOCK_STREAM, 0)
21 if (sock_fd <0)
22 {
23 perror("socket()")
24 return sock_fd
25 }
26
28 local_addr.sin_family = AF_INET
29 local_addr.sin_addr.s_addr = htonl(INADDR_ANY)//自动获取本机的ip地址
30 local_addr.sin_port = htons(0)//随机选取可用的端口,并不是指定端口为0
31
33 remote_addr.sin_family= AF_INET
34 remote_addr.sin_port = htons(REMOTE_PORT)
35 ret = inet_aton("127.0.0.1", &remote_addr.sin_addr)
36
38 ret = bind(sock_fd, (struct sockaddr *)&local_addr, sizeof(local_addr)) //把本机的ip,port和socket绑定
39 if (ret <0)
40 {
41 perror("bind() !")
42 close(sock_fd)
43 return ret
44 }
45
47 ret = connect(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t)sizeof(remote_addr)) //把本机的socket和对方的port,ip建立连接
48 if (ret <0)
49 {
50 perror("connect()")
51 close(sock_fd)
52 return ret
53 }
54
55 memset(buf, 0, MAX_LEN)
56
57 while (1)
58 {
59 int i
60 // len = send(sock_fd, buf, (size_t)MAX_LEN, 0)
61 len = send(sock_fd, "hello", 6, 0)
62 if (len <= 0)
63 {
64 perror("send()")
65 close(sock_fd)
66 return ret
67 }
68
69 // printf("%d-->bytes send!\n", len)
70 sleep(1)
71
72 len = recv(sock_fd, buf, MAX_LEN, 0)
73 if (len <= 0)
74 {
75 perror("recv()")
76 close(sock_fd)
77 return ret
78 }
79
80 for (i = 0i <leni++)
81 {
82 printf("%c", buf[i])
83 }
84 printf("\n")
85 }
86
87 close(sock_fd)
88
89 return 0
90 }
你把服务端和客户端这两个程序分别保存为server.c和client.c。然后编译gcc server.c -o server,gcc client .c -o client。运行时先运行服务端,用命令./server,再运行客户端,用命令./client。 注意运行命令是“点 斜杠”,“点”表示当前目录。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)