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

linux 系统之间,网络编程,消息发送与接收

2016-05-15 12:13 639 查看
linux 系统之间,网络编程,消息发送与接收
chunli@ubuntu:~/udp$ sudo apt-get update
chunli@ubuntu:~/udp$ sudo apt-get install build-essential
chunli@ubuntu:~/udp$ sudo apt-get install make
chunli@ubuntu:~/udp$ ll
-rw-rw-r-- 1 chunli chunli  279 May 15 10:36 makefile
-rw-rw-r-- 1 chunli chunli 2.3K May 15 10:36 myudp.cpp
-rw-rw-r-- 1 chunli chunli  250 May 15 10:37 myudp.h
-rw-rw-r-- 1 chunli chunli  259 May 15 10:37 stdafx.cpp
用这4个文件,编译出一个库文件,源代码在文下面:
chunli@ubuntu:~/udp$ make
g++ -Wall -fPIC -D__UNIX -o myudp.o -c myudp.cpp
g++ -o libmyudp.so myudp.o -shared
^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^
写一个主程序
vim main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "myudp.h"
int main(int argc, char args[])
{
if (argc < 2)
{
bind_socket(8080);
char buf[1024] = { 0 };
char IP[100] = { 0 };
memset(buf, 0, sizeof(buf));
recv_socket(buf, sizeof(buf), IP);
printf("from %s : %s \n",IP,buf);
} else
{
char buf[1024] = { "hello world!" };
send_socket("127.0.0.1", 8080, buf, strlen(buf));
}
return 0;
}
编译
chunli@ubuntu:~/udp$ gcc main.c -L. -lmyudp
向本机发送
chunli@ubuntu:~/udp$ ./a.out 127.0.0.1
等待接收
chunli@ubuntu:~/udp$ ./a.out
from 127.0.0.1 : hello world!


源代码:
chunli@ubuntu:~/udp$ cat makefile
.SUFFIXES: .cpp .o

CC=g++

SRCS=myudp.cpp
OBJS=$(SRCS:.cpp=.o)

OUT=libmyudp.so

all: $(OBJS)
$(CC) -o $(OUT) $(OBJS) -shared
@echo '^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^'

.cpp.o:
$(CC) -Wall -fPIC -D__UNIX -o $@ -c $<

clean:
-rm -f $(OBJS)
-rm -f core*


代码左边要么顶格,要么tab,没有空格。
但是51cto会自动将tab转为4个空格

chunli@ubuntu:~/udp$ cat myudp.cpp

// myudp.cpp : 定义 DLL 应用程序的导出函数。
//

#include <string.h>
#include "stdafx.h"

#ifndef __UNIX
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable:4996)
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define SOCKET int
#endif

SOCKET st = 0;//全局socket变量

void init_sosket()
{
if (st == 0)
{
#ifndef __UNIX
unsigned short ver;
WSADATA wsaData;
ver = MAKEWORD(1, 1);
WSAStartup(ver, &wsaData);//初始化socket
char on = 1;
#else
int on = 1;
#endif
st = socket(AF_INET, SOCK_DGRAM, 0);//建立UDP socket
setsockopt(st, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));//设置可以发送udp广播消息

}
}

void free_socket()
{
if (st)
{
#ifndef __UNIX

closesocket(st);
WSACleanup();
#else
close(st);
#endif
st = 0;
}
}

extern "C"
{
#ifndef __UNIX
__declspec(dllexport)
#endif
int bind_socket(unsigned short port)
{
init_sosket();
struct sockaddr_in recv_addr;
memset(&recv_addr, 0, sizeof(recv_addr));
recv_addr.sin_family = AF_INET;
recv_addr.sin_port = htons(port);//指定port为要连接的端口号
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//指定接收端IP地址为任意
return bind(st, (struct sockaddr *) &recv_addr, sizeof(recv_addr));
}

#ifndef __UNIX
__declspec(dllexport)
#endif
unsigned int recv_socket(char *buf, size_t bufsize, char *srcIP)
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
#ifndef __UNIX
int len = sizeof(addr);
#else
socklen_t len = sizeof(addr);
#endif
unsigned int rc = recvfrom(st, buf, bufsize, 0, (struct sockaddr *) &addr, &len);//接收到来自srcIP的消息
strcpy(srcIP, inet_ntoa(addr.sin_addr));
return rc;
}

#ifndef __UNIX
__declspec(dllexport)
#endif
unsigned int send_socket(const char *destIP, unsigned short port, const char *buf, size_t bufsize)
{
init_sosket();
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);//指定port为要连接的端口号
addr.sin_addr.s_addr = inet_addr(destIP);//指定IP为要连接的IP地址
return sendto(st, buf, bufsize, 0, (struct sockaddr *) &addr, sizeof(addr));//向指定IP发送消息
}
}
chunli@ubuntu:~/udp$ cat myudp.h

#ifndef __MYUDP_H
#define __MYUDP_H
int bind_socket(unsigned short port);
unsigned int recv_socket(char *buf, size_t bufsize, char *srcIP);
unsigned int send_socket(const char *destIP, unsigned short port, const char *buf, size_t bufsize);

#endif
chunli@ubuntu:~/udp$ cat stdafx.h

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#ifndef __UNIX

#pragma once
#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             //  从 Windows 头文件中排除极少使用的信息
// Windows 头文件:
#include <windows.h>
#endif

// TODO:  在此处引用程序需要的其他头文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 系统 接收