您的位置:首页 > 理论基础 > 计算机网络

linux网络编程笔记——TCP

2014-05-19 10:58 369 查看

1、TCP和UDP

TCP是长连接像持续的打电话,UDP是短消息更像是发短信。TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题。

2、网络传输内容

我习惯的做法是直接通过TCP传送结构体,当然前提是收发两端都在程序里对目标结构体有充分的定义。特别说明的一点是,要小心收发两端处理器的大小端问题!而且传输信息头里必须包含长度信息,而且通用的是大端。但是,这里的长度和结构体,我选择用小端进行传输。

3、TCPserver实现

参考了别人多线程的回调写法,看起来不错。

tcputil.c(照搬别人的,文件内有作者信息)

#include "tcputil.h"

int main(int argc, const char *argv[])
{
struct sockaddr_in addr;
int sock;

diff_t *diff=malloc(sizeof(diff_t));
bzero(diff,sizeof(diff_t));

if(argc != 2)
{
fprintf(stderr,"need an IP address\n");
return 1;
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
inet_aton(argv[1],&addr.sin_addr);
addr.sin_port = htons(PORT);
if(       (sock = socket(PF_INET, SOCK_STREAM,0))     <  0        )
{
perror("socket");
}
if(      connect(sock, (struct sockaddr *)&addr, sizeof(addr))    )
{
perror("connect");
}
printf("Connected!\n");
printf("I am station!\n");
printf("Connected to %s:%d\n", inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));

char tag[]="\nstation\n";

uint32_t len =   strlen(tag)+sizeof(diff_t);
int  msg_len = 4+strlen(tag)+sizeof(diff_t);
char *msg=malloc(msg_len);
bzero(msg,msg_len);

memcpy(msg,&len,4);
memcpy(msg+4,tag,strlen(tag));

while(1){
memcpy(msg+4+strlen(tag),diff,sizeof(diff_t));
printf("!!!!!!!!!!!!%d\n", msg_len);
if(write(sock,msg,msg_len) != msg_len)
{
perror("write");
}
sleep(1);
}
free(msg);
close(sock);
return 0;
}


View Code

附上makefile一枚

all:    rover server station

rover:  rover.c tcputil.o
gcc rover.c tcputil.o -o rover -lpthread

server: server.c tcputil.o
gcc server.c tcputil.o -o server -lpthread

station:station.c tcputil.o
gcc station.c tcputil.o -o station -lpthread

tcputil:tcputil.c
gcc tcputil.c -c -lpthread

.PHONY: clean

clean:
rm -f *.o rover server station


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: